86 Commits
v2.9 ... v2.12

Author SHA1 Message Date
EstherLerouzic
7ce6650109 feat: move and update documentation on equipment types
Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: I0f85a059e2393d2d573938bd0804fe49596bbc2d
2025-01-30 17:23:18 +01:00
EstherLerouzic
252e67a71e fix: move amp documentation to the docs folder and update it
Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: Ie6c207e3335cbf30b1f5858c21672dff420b9c51
2025-01-30 17:23:18 +01:00
EstherLerouzic
f83869392b feat: improve documentation of the scripts options
Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: Ic68ded41b188cd07cf87f83e31e6d4eea5af5ed9
2025-01-30 17:23:18 +01:00
EstherLerouzic
94a3714aba fix: documentation missing the worker_utils section
Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: I832b0f0bfdd255396e6c9809273b1171d08c9f60
2025-01-30 17:23:18 +01:00
EstherLerouzic
ccab4835fc fix: Refactor the methods to avoid returning the same value
equipment being a dict, no need to use 'return' to have the changes
applied.

Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: Ic5a4247bbaa0b4af3fca5b6cb0a74a2f434b1b6a
2025-01-30 17:23:18 +01:00
EstherLerouzic
e55f7a5d4c Define default in common parts to be used both by cli and API
Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: I1e9c6aa99fd2896789c73340ccf5c8adf51a5f13
2025-01-30 17:23:18 +01:00
EstherLerouzic
4fda8c6002 use explicit file arguments for additional configs
Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: I133bb6a2d21d573cf819e1d92b1912dfa87dbfa4
2025-01-30 17:23:18 +01:00
EstherLerouzic
8717156712 feat: Read a list of optional extra equipement files
Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: Ic521bbacd38b3bb60da3a364a069abfd1895d337
2025-01-30 17:23:18 +01:00
EstherLerouzic
d2c0836164 Remove default_edfa_config.json dictionary and use parameters.py
But enable the user to still input its own default file with a new
'default_config_from_json' attribute useable in fixed and variable gain
amplifiers.

Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: I773682ae6daa1025007fc051582e779986982838
2025-01-29 18:27:51 +00:00
AndreaDAmico
eac4ba80ea List of collaborative PSE publications added in the docs
Change-Id: I1db6d9fe86004cd5bc8135577421117679cb9965
2025-01-24 08:49:48 +00:00
EstherLerouzic
4ef01d54a5 fix plot bug: do not overwrite the path used for plot
The plot function failed to recognize 'path' as part
of the network due to the reuse of the 'path' variable.
This led to errors when attempting to plot.

Solution is to use a different name for the deepcopy of
path elements used to record the propagation results
'propagated_path'.

Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: I0351c37de0d74391ebeb68e974b777b1f51572aa
2025-01-10 11:08:04 +01:00
EstherLerouzic
4b50ee0c2d fix: do not assume 0 dB default value for tilt-target
Instead keep the None value, it user has not stated anything

Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: I45fcff92caabbfbe514fbe30deac60426b7eb16b
2024-12-06 16:35:46 +01:00
EstherLerouzic
33a289e22b fix: restore uid info in warning logs
Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: I2fdd29a4461b250661b1ccaa9737836fc3fe8695
2024-12-06 16:35:46 +01:00
EstherLerouzic
e593b8c9ec fix case where there are multiple multiband amps matching the sub amp type
Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: Ibe86499866f2f9e3dfd70b51a33b919d584b812b
2024-12-06 16:35:46 +01:00
EstherLerouzic
94a6f922cd fix typing
Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: I0f1621b669b4db833d0760368cd834f3186ee2db
2024-12-06 16:35:46 +01:00
EstherLerouzic
fbe387915b fix: offset was not correctly taken into account on reversed path
TODO: write a test!

Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: I7ac909bb9b8c9700c3841f133245f17f49ba3467
2024-12-06 16:35:46 +01:00
EstherLerouzic
fce9d1d293 chore: refactor json_io
Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: If764ba7b520a060deb855c0b55e17c78fa22f841
2024-12-06 16:35:46 +01:00
EstherLerouzic
a59db8fd12 fix: cli_examples linter issues
Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: Id7e2f8b7282913b885062a01f1bd018bbc85e39c
2024-12-06 16:35:46 +01:00
EstherLerouzic
de509139b3 fix: linter issues on json_io
add docstrings, typing, small fixes

Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: I01d0fabe5e34103077ec2de829e96829e6202e1e
2024-12-06 16:35:46 +01:00
EstherLerouzic
bb77b3f4a8 fix: remove unused _automatic_spacing
Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: Ie3c2fc226f8a549622933cbd1ba8a6b8be213f92
2024-12-06 16:35:46 +01:00
EstherLerouzic
34c7fd1b60 fix: save autodesign file after autodesign!
Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: If1c82c8cb7ff9dbb8bf5c2d5c4b96beaa59dc402
2024-12-06 16:35:46 +01:00
EstherLerouzic
89a962ffaf fix remove unnecessary else after return
Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: I61dc58f15c8f03a686437e19a36ac0afe35904e9
2024-12-06 16:35:46 +01:00
EstherLerouzic
1722fbec13 feat: add more warnings on amplifiers
when user settings do not match library

Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: Id387b7781d9637f1d18c453dae75330962229902
2024-12-06 16:35:46 +01:00
EstherLerouzic
e48aa57c35 Improve error reporting by including uid of elements
Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: Ief4125322e4db02765974c43159a014749cdab2e
2024-12-06 16:35:46 +01:00
EstherLerouzic
e3e37b1986 feat: skip path computation when path is explicit
and add tests for explicit path

Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: I95aaf5b56a7ea04f24153d5cb6612cd09401401c
2024-12-06 16:35:46 +01:00
EstherLerouzic
abf42afaf8 fix ci: The macOS-12 environment is deprecated
remove this check and add one for The macOS-14 instead

Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: Ief1c990cbc67ec4d7912404c24d67f9f2fa6d96e
2024-12-06 16:35:46 +01:00
EstherLerouzic
310995045e fix: linter issues in convert and service_sheet
Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: I5f7490ed61b53cea8d2923a8a54d38b3fbb5fa0a
2024-12-06 16:35:43 +01:00
EstherLerouzic
c840bb1a44 Improve test coverage on ila constraint cases
explicitely check the corrections for all cases
ila defined in eqpt or not,
ila defined on the link with same direction as request or not
constraint loose or strict
several or one ila in the OMS

Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: I4d4b5167e7327c9aea4b13879f4e00d30e60d643
2024-11-25 17:07:36 +01:00
EstherLerouzic
4b6f4af3a5 Refactor to reduce cognitive complexity
Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: Ia9992ebbe06498ed53b3987edd4eb139d960ff75
2024-11-25 17:07:33 +01:00
EstherLerouzic
dc68d38293 fix ila names
auto design were changed long ago and these functions did not
apply the changes. Besides there was a confusion between request_element
class where loose is a string, and PathRequest from topology.requests
where loose_list is a list of strings.
This patch corrects the naming and also the tests,
because it used the wrong class to gererate xls services

Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: I564b77576459d6cb47767398a2db8138ba6ad1e4
2024-11-25 16:55:25 +01:00
EstherLerouzic
defe3bee5c feat: documentation for ROADM excel sheet input
Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: Ie662015c9cd0a90aff46c63fce47d678ffe1d4db
2024-11-25 12:09:14 +01:00
EstherLerouzic
32adc0fc53 feat: enables reading per degree impairment from xls input
- read per degre roadm-path impairment from roadm sheet
add additional optional columns: type_variety and 'from degrees'
and 'from degree to degree impairment id'
'from degrees' can contain a list of degrees separated with ' | ', then the
'from degree to degree impairment id' must contain a list of ids of the same
length.
Impairment ids are expected to be in the ROADM equipment spec and
from degree must be the previous node (no verification of user input).

Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: I7d326bb3d4f366835249089e9537747c7d3ec2fd
2024-11-25 12:09:09 +01:00
EstherLerouzic
4796266657 fix bug in roadm to_json: move per_degree_impairments in params
Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: I75ed610f201608a3cb651e8c0604de444113bc25
2024-11-25 08:55:00 +01:00
EstherLerouzic
c35104c184 Add documentation for multiband
Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: Iadf6d9edd8c67c1389c4a0d482466a8c52198621
2024-11-21 09:26:51 +01:00
AndreaDAmico
7b1354ee24 fix: avoid using cumtrapz from scipy
cumtrapz has been replaced with cumulative_trapezoid in the scipy version currently required by GNPy.

Change-Id: I6790f7aa8d8e8d171faa48db4b20e6a93141c471
2024-11-15 22:25:27 +00:00
AndreaDAmico
39d3f0f483 Perturbative Raman Solver
Raman effect evaluation based on a perturbative solution for faster computation

Change-Id: Ie6d4ea4d9f95d8755dc8dfd004c954d4c2c5f759
2024-11-08 19:55:20 +00:00
AndreaDAmico
bbe9ef7356 Increasing precision in Raman tests
Change-Id: I7a4de449a673d2e2ac23376d7fe64399c65e1246
2024-11-08 18:12:49 +00:00
AndreaDAmico
42a8f018cd GGN approximation formula defined
An approximated version of the GGN is implemented to reduce the computational time enabling fast multi-band transmission simulations

Change-Id: I2951a878aa04b5eb4a33ba86d626a788c4cbb100
2024-11-08 18:09:44 +00:00
EstherLerouzic
29f5dd1dc4 Add frequency dependency on ROADM impairments
Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: Icb88bf9c42c09deb0064e3299b78b080462fef79
2024-10-16 17:49:00 +00:00
EstherLerouzic
03da959724 insert multiband_amplifier if needed
the automatic add_missing_elements function is updated to insert
multiband booster, preamp or inline amplifiers based on the OMS
nature. If nothing is stated, then uses Edfas.

Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: I968a2fc0a3da97aecb7b513ff211491b20cdd4f2
2024-10-16 17:47:29 +00:00
EstherLerouzic
f621ca6fe7 Add tilt computation for design targets
Compute the tilts only if raman-flag in sim_params is turned on.
Use actual input power in fiber (according to expected propagation
during design).
Creates a function that computes the expected tilt after propagation
in a span, and returns the normalized power difference at the center
frequency of each band, and the tilt experenced between lower and
upper frequency in each band.
Include the expected tilt when computing target gains of amplifiers.
Current function requires that the bands remain in the same order.
(ordering is ensured when creating the objects).

Change-Id: I28bdf13f2010153175e8b6d199fd8eea15d7b292
2024-10-16 17:46:59 +00:00
EstherLerouzic
24f4503020 Preselect multiband amplifiers based on band gain and power targets
To ensure that the multiband amplifier meets the required gain and
power targets for each band, this commit introduces a preselection
process for the amplifiers type variety. The preselection ensures
that only compatible amplifiers are considered, avoiding that
an amplifier is selected for one band that is not part of the same
multiband amplifier type variety of the amplifier selected for the
other band(s).

Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: I8de7e0b7c165e6edfe47d7f4cda80db23924a9c9
2024-10-16 17:46:34 +00:00
EstherLerouzic
520c3615e4 Refactor select_edfa
Objective is to reuse the functions that lists suitable type variety candidates
for each amplifier of the multiband amplifier

restrictions are processed before entering select_edfa.

Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: I8c784cef6bfed9a2e95bc39434a32191678db81f
2024-10-16 17:40:29 +00:00
EstherLerouzic
548626a9f2 preselect amplifiers based on restrictions and bands
make sure that selected amplifiers (single or multiband) have a band
that encompasses design_band.

Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: I8b66755efbe8413f32328b9e02099ffdedd4b7ed
2024-10-16 17:40:01 +00:00
EstherLerouzic
7a26833a5a Add some test on select_edfa
Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: Ia54c62fe76175f16048992ca1f67439dd32c6e5e
2024-10-16 17:39:39 +00:00
EstherLerouzic
c2f6f9c6a0 Add an invocation test with multiband case
Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: I0a98175f0c6b4333fae6bea40dac826032a25233
2024-10-16 17:39:13 +00:00
EstherLerouzic
64a91256fc Propagate power per band during autodesign
Target setting computation is done going through each element of the OMS
and computing resulting delta power after each amplifier element. In order
to account for different delta power per band (multi band autodesign), the
computation must be made per band. The previous introduction of a standard
name for bands ("CBAND", "LBAND") ensures a stable key to index these
delta power computation.

Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: Ida4b2486ebde4f2a1fb21a44458d1fe34a788d1f
2024-10-16 17:37:35 +00:00
EstherLerouzic
bdcffc2a5e Refactor: define a separate function to compute targets
Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: I5698feb059f13b90c1ab3d0843fb000c4e0b6b59
2024-10-16 17:36:52 +00:00
EstherLerouzic
c384af8062 Refactor: create a function to set one single band amplifier
Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: I00018c38b0cc0ceefcd21d50dd0cdc639019cc70
2024-10-16 17:36:25 +00:00
EstherLerouzic
0813332adc Enable differentiated design band per OMS
Introduce a design_band parameter in ROADM and Transceiver.
- if nothing is defined, use SI band(s)
- if design band is defined in ROADM, use this one for all degrees
- if per degree design band is defined, use this one instead

unsupported case: single band OMS with default multiband design band.
Check that these definitions are consistent with actual amplifiers

Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: Ibea4ce6e72d2b1e96ef8cf4efaf499530d24179c
2024-10-16 17:31:33 +00:00
EstherLerouzic
22fe9ead55 Introduce multi band amps
Introduce a new multi-band element that contains a list of Edfa element:
- reads multiple amps out of the element config.
- deduces frequency band from the amp in the list.

no autodesign yet: multi-band amps must have type_variety.

- checks that type variety of individual EDFAs is consistent with multiband
type variety
- demux and mux spectrum when propagate in multiband
- don't add a preamp or booster if a multiband amp is already defined.

The print of channel number is removed from equipment, since the channel number
may now depend on the path's amplifiers. This changes invocation results layout.

Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: I44e77ff82e622cdee4021a7984d660317cb90cf9
2024-10-16 17:26:11 +00:00
EstherLerouzic
920ac30aa5 Refactor and simplify network functions
Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: Ifa0949a8b7739036639e1a4b006ceb08804558ce
2024-10-16 17:24:52 +00:00
EstherLerouzic
ac8fd770ab Only propagates carriers that belong to Amp bandwidth
The commit introduces mux/demux functions in amps and ensures that the
propagation is only done on carriers that are in the Amp bandwitdh, ie
with all their spectrum including slot width is in bandwidth.

For consistency, default amp f_min is changed:
Objective is to use amplifiers' band to bound the possible frequencies
to be propagated. Since the current default f_min of Amp in json_io.py is
higher than the SI one, this would result in a different nb of channels
than currently used in tests, and a change in all tests. In order to
avoid this, I preferred to change this value and have consistency
between SI f_min and Amp f_min.

The commits adds a set of functions to make amps band the useable
spectrum on each OMS. Thee OMS generation is changed to use the amp band.

The commit adds filtering functions (demux and mux) to filter out spectrum
which is not in the amplifier band.

Spectrum assignment is also corrected to correctly match the amp bandwidth
constraint with guardband: center frequency index must be within the
usable part of the amp band. This changes a bit the notion of freq_index
and guardband in the functions, but this is transparent to user:
f_min, f_max represent the amp band, while self.freq_index_min/max
represent the center frequency boundary for a reference 50GHz channel.

Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: I225b2b2dc0e1f1992c0460f6e08fa9c9bc641edf
2024-10-16 17:16:21 +00:00
EstherLerouzic
5277ae2005 Add a redesign option
redesign True means that network is redesigned using each request
as reference channel. When False it means that the design is made
once and successive propagation use the settings computed with this
design.

Default propogation is without redesign, so that path-request-script
must use the ----redesign-per-request option to behave as before this
commit.

Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: I0084185106d14659a846136620cd17791d551a7d
2024-10-16 17:15:20 +00:00
EstherLerouzic
30ead40e76 Creates a set of functions to be called by CLI and API
Instead of copying the CLI script in API code, use functions shared
by CLI and API

Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: I3f9b30b8700b68237d0e80768db015d8dec3deb5
2024-10-16 17:13:25 +00:00
EstherLerouzic
ae858b911a fix: capture warning to show the ROADM uid
Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: Ie13bf4c3436a5a0b8ec730698920eee2c7fb81e8
2024-10-16 17:10:34 +00:00
EstherLerouzic
0d236fd31e fix: remove unused invocation test file
Wrongly added by commit #4a071c5

Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: I337b8d4560cd7f2634fca7d242783da327127de5
2024-10-16 16:42:09 +00:00
EstherLerouzic
9a84e29433 fix: remove freq2wavelength that is already defined
Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: I8ef480460e689bfcb33116cd393ad92ed0e03338
2024-10-08 11:07:13 +00:00
‘Renato
143f63170e FIX: json indentation in example-data
Change-Id: If3585fc554638cb1e5f7e4564d10af29420b6159
2024-09-20 13:49:26 +00:00
EstherLerouzic
b2d7f883a1 Add documentation for topology, service and sim-params files
Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: I0d917b742acd91aa52403f1ac96a378bb3cd8497
2024-06-02 19:26:33 +02:00
EstherLerouzic
73dbdf3042 Add documentation for the roadm impairment feature
Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: Ief7e79ef10edf098c49ab1a0164284e5ae604961
2024-06-02 19:26:33 +02:00
EstherLerouzic
4a071c53d7 feat: transform roadm-paths into list indexed with frequency band
to be conformed with ietf + to prepare for next multiband case

Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: If71857ef7dff9eaaa4c16e3837d3500bcef2fa72
2024-06-02 19:26:33 +02:00
EstherLerouzic
dcde64a8db clean some leftover from previous refactor
Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: Ibd6e32090155433d7b1aa5b6572f1fe07a4cbe4a
2024-06-02 19:26:33 +02:00
EstherLerouzic
38cc0e3cc5 feat: separate span power from tx power
gnpy currently uses the same parameter for tx output power and span
input power: this prevents from modelling low tx power effect.
This patch introduces a new tx-cannel-power and uses it to
propagate in ROADM.

Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: Id3ac75e2cb617b513bdb38b51a52e05d15af46f5
2024-06-02 19:26:33 +02:00
EstherLerouzic
fb70413784 Refactor equipment and add some tests
This fixes error message for wrong trx type,  catches the case of
KeyError when trx_type is not part of the library.

removes power setting from this function: power out of transceiver or
at the input of span is nor defined in equipment Transceiver

Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: I15fa7cc772ab5c1a8c7637738eb83c2ddffa1219
2024-06-02 19:26:33 +02:00
EstherLerouzic
87e10c240e Add test on blocking due to PDL penalty
Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: I2d6a7f9ed0ff8ad6977bcfe1b78ed620bb0e848d
2024-06-02 19:26:33 +02:00
EstherLerouzic
43c1085be6 feat: apply per path_type ROADM OSNR
Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: I2b0838c9a217a7f918b2cf08c233aacdbf686a72
2024-06-02 19:26:33 +02:00
EstherLerouzic
4ace60bea2 Feat: apply roadm-path loss
Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: I87e27d5b653bdce814f43e4c9c1183fb51fbcc1e
2024-06-02 19:26:33 +02:00
EstherLerouzic
f950a6aee8 Feat: add detailed ROADM impairments per roadm-path
Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: I09c55dcff53ffb264609654cde0f1d8b9dc7fe9b
2024-06-02 19:26:33 +02:00
EstherLerouzic
fb4195c775 Feat: Enable multiple type_varieties for ROADM
This commit introduces the 'type_variety' attribute for ROADM elements,
allowing the use of different types of ROADM specifications instead of
being limited to the default one.

If no type variety name is provided in the eqpt_config, the 'default'
name is used for backward compatibility with libraries. Additionally,
if no type variety is defined in the ROADM element in the topology,
the default one is used for backward compatibility with topologies.

The 'type_variety' attribute is included in the 'to_json' and
'display' methods for ROADM elements.

Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: I61a2491f994e47ad0b08cf8eaef30d6d855aa706
2024-06-02 19:26:33 +02:00
EstherLerouzic
29f42666e5 remove whites spaces and align parentheses
Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: I0f5f389a3cf20155ceb0e9d9f071d1334a5ad688
2024-06-02 19:26:33 +02:00
EstherLerouzic
9bf7f336e3 Update release notes of v2.9
Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: Ib949ff81fa818886a69339117bc66290dc2685b0
2024-06-02 19:26:27 +02:00
EstherLerouzic
eed6564f11 Add power sweep functionality description in documentation
Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: Ic8db566bc168f120ddb0016c91bcc1d24263548c
2024-06-02 19:17:07 +02:00
EstherLerouzic
fbb2f2c587 fix missing to_json export of computed_number_of_channels
The parameter was introduced in commit 9736f7c032
but the export to_json was not added.

In the next commits, it is necessary to compute Raman gain during the design
phase. The sim-params used for this computation are updated during the
design phase for speed reasons. To ensure the proper restoration of user
settings for propagation, the export must include all parameters. Therefore,
this commit adds 'computed_number_of_channels' to the JSON export. This allows
for the accurate recording of all user settings locally and enables their
restoration.

Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: I221a6f614010edea9cf46c3a7d43c5be064ff09c
2024-06-01 19:17:50 +02:00
EstherLerouzic
44040c4d06 fix missing description of computed_number_of_channels
Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: I5c8d057dcdab535617eee8de3eccdd806cec403e
2024-06-01 09:11:56 +02:00
EstherLerouzic
ee9af69558 Improve doc to state when tilt is vs wavelength
add some text in the docs to explain that tilt can be expressed
vs freq or lambda depending on context:
advanced_model expresses dgt as a function of frequency,
while tilt target is still defined vs wavelength (common usage).

Change the variable to have explicit name when it is per wavelength,
or add a comment to help identifyper wavelength or per frequency
variables.

Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: I7727f00b38244152b95954e981cc9da096bb3d1d
2024-05-24 07:11:02 +00:00
Esther Le Rouzic
ce21609fec Merge "fix: image of the script and documentation" 2024-05-22 14:24:26 +00:00
Esther Le Rouzic
a1289e6a9b Merge "feat: enable different sim_param vectors for multiple requests" 2024-05-22 14:19:35 +00:00
AndreaDAmico
138115e1d7 Frequency scaling description in release notes v2.8
Change-Id: I74f3d52a3cbc087b914ff18075869d2162b693ac
2024-05-16 01:23:27 -04:00
EstherLerouzic
ed41305f55 fix: image of the script and documentation
Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: Ib022320efd36a2d912f7b443686d7fee137e48b1
2024-04-26 18:19:53 +02:00
EstherLerouzic
9736f7c032 feat: enable different sim_param vectors for multiple requests
Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: Ia800a7b98b33b795cc3553500116be61c612e45c
2024-04-26 17:12:43 +02:00
EstherLerouzic
be7ae35db3 Refactor amp default in parameters
default parameters are shared between json and network function,
so it is better to have them on the parameters to avoid circular
dependency when importing modules

Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: Ib9d41852e394586d36f74992c91f67f3330cc552
2024-04-25 17:51:56 +02:00
EstherLerouzic
2b4a4ab72c fix Raman gain estimation during design
- Replaced multiple calls to the span_loss function
  with recording the span loss result in the fiber elements,
  reducing computation time.
- Updated Raman gain estimation based on design target powers to ensure
  accurate Edfa gain calculation or gain reduction during design.
- display the computed and design Raman gain in RamanFiber string output
- do not add padding on Raman fibers
- Added to_json function to preserve user input SimParams values,
  which were previously overwritten by initializing SimParams
  with fake values during design.

Next step is to allow users to balance computation time and
target accuracy of the design by inputing their own SimParams
and ref channels design values.

Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: I1ca4954d0621858cefb3d776a538131992cae3e3
2024-04-12 08:58:16 +02:00
EstherLerouzic
426c88432d fix: update README script animation
Signed-off-by: EstherLerouzic <esther.lerouzic@orange.com>
Change-Id: I31381ddf3e372f34836416162c080a5205ef969d
2024-04-12 08:41:27 +02:00
AndreaDAmico
2a800b781f Bug fix: Raman coefficient properly scaled in non SSMF case
Before the Raman coefficient was normalized with respect the given effective area, instead of the reference.

Change-Id: I4c0547db4fbd0f823a9058022b93c1ca37d67b51
2024-04-11 01:21:02 -04:00
Jan Kundrát
8d1d3677ed docs: fix graphs on RTD
At OFC I was talking with the OpenROADM people, and it turned out that
our docs stopped rendering properly at RTD. It turned out that the build
started skipping the bindep.txt file at some (unknown) point in time.

Reported-by: Aparaajitha G L <aparaajitha.gomathinayakamlatha@utdallas.edu>
Change-Id: Ie9a4b61f36fb979fb5c109d02de06e0b2cbf270e
2024-03-29 19:23:08 +01:00
104 changed files with 15263 additions and 4858 deletions

View File

@@ -118,10 +118,10 @@ jobs:
python_version: "3.11"
- os: windows-2022
python_version: "3.12"
- os: macos-12
python_version: "3.11"
- os: macos-13
python_version: "3.12"
- os: macos-14
python_version: "3.12"
paywalled-platforms:
name: Tests on paywalled platforms

View File

@@ -3,6 +3,8 @@ build:
os: ubuntu-22.04
tools:
python: "3.12"
apt_packages:
- graphviz
python:
install:

View File

@@ -23,7 +23,7 @@ Read our [documentation](https://gnpy.readthedocs.io/), learn from the demos, an
This example demonstrates how GNPy can be used to check the expected SNR at the end of the line by varying the channel input power:
![Running a simple simulation example](https://telecominfraproject.github.io/oopt-gnpy/docs/images/transmission_main_example.svg)
![Running a simple simulation example](docs/images/gnpy-transmission-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/), or give it a [try online at `gnpy.app`](https://gnpy.app/):

View File

@@ -1,18 +1,19 @@
*********************************************
.. _amp_models:
Amplifier models and configuration
*********************************************
==================================
1. Equipment configuration description
#######################################
--------------------------------------
Equipment description defines equipment types and parameters.
It takes place in the default **eqpt_config.json** file.
It takes place in the equipment library such as **eqpt_config.json** file defined in example-data folder.
By default **gnpy-transmission-example** uses **eqpt_config.json** file and that
can be changed with **-e** or **--equipment** command line parameter.
2. Amplifier parameters and subtypes
#######################################
------------------------------------
Several amplifiers can be used by GNpy, so they are defined as an array of equipment parameters in **eqpt_config.json** file.
@@ -28,9 +29,16 @@ Several amplifiers can be used by GNpy, so they are defined as an array of equip
- *"variable_gain"*
- *"fixed_gain"*
- *"dual_stage"*
- *"multi_band"*
- *"openroadm"*
*see next section for a full description of these models*
- *"default_config_from_json"*:
Use a custom per frequency dynamic gain tilt, gain and noise ripple arrays defined in the file specified with
this option, instead of the default values from GNPy.
- *"advanced_config_from_json"*:
**This parameter is only applicable to the _"advanced_model"_ model**
@@ -135,7 +143,7 @@ Several amplifiers can be used by GNpy, so they are defined as an array of equip
3. Amplifier models
#######################################
-------------------
In an opensource and multi-vendor environnement, it is needed to support different use cases and context. Therefore several models are supported for amplifiers.
@@ -179,7 +187,7 @@ In an opensource and multi-vendor environnement, it is needed to support differe
- *"variable_gain"*
This model is refered as an operator model because a lower level of knowledge is required. A full polynomial description of the NF cross the gain range is not required. Instead, NF_min and NF_max values are required and used by the code to model a dual stage amplifier with an internal mid stage VOA. NF_min and NF_max values are typically available from equipment suppliers data-sheet.
There is a default JSON file ”default_edfa_config.json”* to enforce 0 tilt and ripple values because GNpy core algorithm is a multi-carrier propogation.
There is a default configuration to enforce 0 tilt and ripple values because GNPy core algorithm is a multi-carrier propagation.
- gain_ripple =[0,...,0]
- nf_ripple = [0,...,0]
- dgt = [...] generic dgt comb
@@ -250,7 +258,7 @@ In an opensource and multi-vendor environnement, it is needed to support differe
- gain_min indicates to auto_design when this dual_stage should be used
But unlike other models the 1st stage input will not be padded: it is always operated to its maximu gain and min NF. Therefore if gain adaptation and padding is needed it will be performed by the 2nd stage.
But unlike other models the 1st stage input will not be padded: it is always operated to its maximum gain and min NF. Therefore if gain adaptation and padding is needed it will be performed by the 2nd stage.
.. code-block:: json
@@ -263,8 +271,18 @@ In an opensource and multi-vendor environnement, it is needed to support differe
"allowed_for_design": true
}
- *"multiband"*
This model enables the definition of multiband amplifiers that consist of multiple single-band
amplifier elements, with each amplifier responsible for amplifying a different portion of the spectrum.
The types of single-band amplifiers that can be included in these multiband amplifiers are specified,
allowing for multiple options to be available for the same spectrum band (for instance, providing
several permitted type varieties for both the C-band and the L-band). The actual element utilizing the
type_variety must implement only one option for each band.
4. advanced_config_from_json
#######################################
----------------------------
The build_oa_json.py library in ``gnpy/example-data/edfa_model/`` can be used to build the json file required for the amplifier advanced_model type_def:

View File

@@ -1860,3 +1860,165 @@ month={Sept},}
pages={3499-3511},
doi={10.1109/JLT.2022.3162134}
}
@inproceedings{grammel2018physical,
title={Physical simulation environment of the telecommunications infrastructure project (TIP)},
author={Grammel, Gert and Curri, Vittorio and Auge, Jean-Luc},
booktitle={Optical Fiber Communication Conference},
pages={M1D--3},
year={2018},
organization={Optica Publishing Group}
}
@inproceedings{taylor2018towards,
title={Towards a route planning tool for open optical networks in the telecom infrastructure project},
author={Taylor, Brian D and Goldfarb, Gilad and Bandyopadhyay, Saumil and Curri, Vittorio and Schmidtke, Hans-Juergen},
booktitle={Optical Fiber Communication Conference},
pages={Tu3E--4},
year={2018},
organization={Optica Publishing Group}
}
@article{filer2018multi,
title={Multi-vendor experimental validation of an open source QoT estimator for optical networks},
author={Filer, Mark and Cantono, Mattia and Ferrari, Alessio and Grammel, Gert and Galimberti, Gabriele and Curri, Vittorio},
journal={Journal of Lightwave Technology},
volume={36},
number={15},
pages={3073--3082},
year={2018},
publisher={IEEE}
}
@inproceedings{auge2019open,
title={Open optical network planning demonstration},
author={Auge, Jean-Luc and Grammel, Gert and Le Rouzic, Esther and Curri, Vittorio and Galimberti, Gabriele and Powell, James},
booktitle={Optical Fiber Communication Conference},
pages={M3Z--9},
year={2019},
organization={Optica Publishing Group}
}
@inproceedings{kundrat2020physical,
title={Physical-layer awareness: GNPy and ONOS for end-to-end circuits in disaggregated networks},
author={Kundr{\'a}t, Jan and Campanella, Andrea and Le Rouzic, Esther and Ferrari, Alessio and Havli{\v{s}}, Ond{\v{r}}ej and Ha{\v{z}}linsk{\`y}, Michal and Grammel, Gert and Galimberti, Gabriele and Curri, Vittorio},
booktitle={2020 Optical Fiber Communications Conference and Exhibition (OFC)},
pages={1--3},
year={2020},
organization={IEEE}
}
@inproceedings{ferrari2020experimental,
title={Experimental validation of an open source quality of transmission estimator for open optical networks},
author={Ferrari, Alessio and Filer, Mark and Balasubramanian, Karthikeyan and Yin, Yawei and Le Rouzic, Esther and Kundr{\'a}t, Jan and Grammel, Gert and Galimberti, Gabriele and Curri, Vittorio},
booktitle={2020 Optical Fiber Communications Conference and Exhibition (OFC)},
pages={1--3},
year={2020},
organization={IEEE}
}
@article{ferrari2020gnpy,
title={GNPy: an open source application for physical layer aware open optical networks},
author={Ferrari, Alessio and Filer, Mark and Balasubramanian, Karthikeyan and Yin, Yawei and Le Rouzic, Esther and Kundr{\'a}t, Jan and Grammel, Gert and Galimberti, Gabriele and Curri, Vittorio},
journal={Journal of Optical Communications and Networking},
volume={12},
number={6},
pages={C31--C40},
year={2020},
publisher={Optica Publishing Group}
}
@inproceedings{ferrari2020softwarized,
title={Softwarized optical transport QoT in production optical network: a Brownfield validation},
author={Ferrari, Alessio and Balasubramanian, Karthikeyan and Filer, Mark and Yin, Yawei and Le Rouzic, Esther and Kundr{\'a}t, Jan and Grammel, Gert and Galimberti, Gabriele and Curri, Vittorio},
booktitle={2020 European Conference on Optical Communications (ECOC)},
pages={1--4},
year={2020},
organization={IEEE}
}
@article{ferrari2021assessment,
title={Assessment on the in-field lightpath QoT computation including connector loss uncertainties},
author={Ferrari, Alessio and Balasubramanian, Karthikeyan and Filer, Mark and Yin, Yawei and Le Rouzic, Esther and Kundr{\'a}t, Jan and Grammel, Gert and Galimberti, Gabriele and Curri, Vittorio},
journal={Journal of Optical Communications and Networking},
volume={13},
number={2},
pages={A156--A164},
year={2021},
publisher={Optica Publishing Group}
}
@inproceedings{kundrat2021gnpy,
title={GNPy \& YANG: open APIs for end-to-end service provisioning in optical networks},
author={Kundr{\'a}t, Jan and Le Rouzic, Esther and M{\aa}rtensson, Jonas and Campanella, Andrea and Havli{\v{s}}, Ond{\v{r}}ej and DAmico, Andrea and Grammel, Gert and Galimberti, Gabriele and Curri, Vittorio and Vojt{\v{e}}ch, Josef},
booktitle={Optical Fiber Communication Conference},
pages={M1B--6},
year={2021},
organization={Optica Publishing Group}
}
@inproceedings{d2021gnpy,
title={GNPy experimental validation on flex-grid, flex-rate WDM optical transport scenarios},
author={DAmico, Andrea and London, Elliot and Le Guyader, Bertrand and Frank, Florian and Le Rouzic, Esther and Pincemin, Erwan and Brochier, Nicolas and Curri, Vittorio},
booktitle={Optical fiber communication conference},
pages={W1G--2},
year={2021},
organization={Optica Publishing Group}
}
@inproceedings{virgillito2021testing,
title={Testing TIP open source solutions in deployed optical networks},
author={Virgillito, Emanuele and Braun, Ralf-Peter and Breuer, Dirk and Gladisch, Andreas and Curri, Vittorio and Grammel, Gert},
booktitle={Optical Fiber Communication Conference},
pages={F1C--3},
year={2021},
organization={Optica Publishing Group}
}
@article{d2022experimental,
title={Experimental validation of GNPy in a multi-vendor flex-grid flex-rate WDM optical transport scenario},
author={DAmico, Andrea and London, Elliot and Le Guyader, Bertrand and Frank, Florian and Le Rouzic, Esther and Pincemin, Erwan and Brochier, Nicolas and Curri, Vittorio},
journal={Journal of Optical Communications and Networking},
volume={14},
number={3},
pages={79--88},
year={2022},
publisher={Optica Publishing Group}
}
@inproceedings{mano2022accuracy,
title={Accuracy of nonlinear interference estimation on launch power optimization in short-reach systems with field trial},
author={Mano, Toru and DAmico, Andrea and Virgillito, Emanuele and Borraccini, Giacomo and Huang, Yue-Kai and Kitamura, Kei and Anazawa, Kazuya and Masuda, Akira and Nishizawa, Hideki and Wang, Ting and others},
booktitle={European Conference and Exhibition on Optical Communication},
pages={We3B--1},
year={2022},
organization={Optica Publishing Group}
}
@inproceedings{kundrat2022gnpy,
title={GNPy: Lessons learned and future plans},
author={Kundr{\'a}t, Jan and Le Rouzic, Esther and M{\aa}rtensson, Jonas and Melin, Stefan and DAmico, Andrea and Grammel, Gert and Galimberti, Gabriele and Curri, Vittorio},
booktitle={European Conference and Exhibition on Optical Communication},
pages={We3B--6},
year={2022},
organization={Optica Publishing Group}
}
@inproceedings{grammel2023open,
title={Open Optical Networks: the good, the bad and the ugly},
author={Grammel, Gert and Kundrat, Jan and Le Rouzic, Esther and Melin, Stefan and Curri, Vittorio and d'Amico, Andrea and Manzotti, Roberto},
booktitle={49th European Conference on Optical Communications (ECOC 2023)},
volume={2023},
pages={1585--1588},
year={2023},
organization={IET}
}
@inproceedings{d2024gnpy,
title={GNPy Experimental Validation in a C+ L Multiband Optical Multiplex Section},
author={DAmico, Andrea and Gatto, Vittorio and Nespola, Antonino and Borraccini, Giacomo and Jiang, Yanchao and Poggiolini, Pierluigi and Le Rouzic, Esther and de Lerma, Arturo Mayoral L{\'o}pez and Grammel, Gert and Manzotti, Roberto and others},
booktitle={2024 24th International Conference on Transparent Optical Networks (ICTON)},
pages={1--4},
year={2024},
organization={IEEE}
}

298
docs/cli_options.rst Normal file
View File

@@ -0,0 +1,298 @@
.. _cli-options:
Options Documentation for `gnpy-path-request` and `gnpy-transmission-example`
=============================================================================
Common options
--------------
**Option**: `--no-insert-edfas`
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
**Purpose**: Disables the automatic insertion of EDFAs after ROADMs and fibers, as well as the splitting
of fibers during the auto-design process.
The `--no-insert-edfas` option is a command-line argument available in GNPy that allows users to control the
automatic insertion of amplifiers during the network design process. This option provides flexibility for
users who may want to manually manage amplifier placements or who have specific design requirements that
do not necessitate automatic amplification.
To use the `--no-insert-edfas` option, simply include it in the command line when running your GNPy program. For example:
.. code-block:: shell-session
gnpy-transmission-example my_network.json --no-insert-edfas
When the `--no-insert-edfas` option is specified:
1. **No Automatic Amplifiers**: The program will not automatically add EDFAs to the network topology after
ROADMs or fiber elements. This means that if the network design requires amplification, users must ensure
that amplifiers are manually defined in the network topology file. Users should be aware that disabling
automatic amplifier insertion may lead to insufficient amplification in the network if not managed properly.
It is essential to ensure that the network topology includes the necessary amplifiers to meet performance requirements.
2. **No Fiber Splitting**: The option also prevents the automatic splitting of fibers during the design process.
This is particularly useful for users who want to maintain specific fiber lengths or configurations without
the program altering them.
**Option**: `--equipment`, `-e`
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
**Description**: Specifies the equipment library file.
**Usage**:
.. code-block:: shell-session
gnpy-transmission-example my_network.json --equipment <FILE.json>
**Default**: Uses the default equipment configuration in the example-data folder if not specified.
**Functionality**: This option allows users to load a specific equipment configuration that defines the characteristics of the network elements.
**Option**: `--extra-equipment` and `--extra-config`
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The `--extra-equipment` and `--extra-config` options allow users to extend the default equipment library and configuration
settings used by the GNPy program. This feature is particularly useful for users who need to incorporate additional
equipment types or specific configurations that are not included in the standard equipment library (such as third party pluggables).
**Usage**:
.. code-block:: shell-session
--extra-equipment <file1.json> [<file2.json> ...]
**Parameters**:
- `<file1.json>`: Path to the first additional equipment file.
- `<file2.json>`: Path to any subsequent additional equipment files (optional).
**Functionality**:
- The program will merge the equipment definitions from the specified files into the main equipment library.
- If an equipment type defined in the additional files has the same name as one in the main library, the program
will issue a warning about the duplicate entry and will include ony the last definition.
- This allows for flexibility in defining equipment that may be specific to certain use cases or vendor-specific models.
**`--extra-config`**:
**Description**: This option allows users to specify additional configuration files that can override
or extend the default configuration settings used by the program. This is useful for customizing simulation
parameters or equipment settings. To set an amplifier with a specific such config, it must be defined in the
library with the keyword "default_config_from_json" filled with the file name containing the config in the case of
"variable_gain" amplifier or with the "advanced_config_from_json" for the "advanced_model" amplifier.
**Usage**:
.. code-block:: shell-session
--extra-config <file1.json> [<file2.json> ...]
**Parameters**:
- `<file1.json>`: Path to the first additional configuration file.
- `<file2.json>`: Path to any subsequent additional configuration files (optional).
**Functionality**:
The program will load the configurations from the specified files and consider them instead of the
default configurations for the amplifiers that use the "default_config_from_json" or "advanced_config_from_json" keywords.
Example
-------
To run the program with additional equipment and configuration files, you can use the following command:
.. code-block:: shell-session
gnpy-transmission-example --equipment main_equipment.json \
--extra-equipment additional_equipment1.json additional_equipment2.json \
--extra-config additional_config1.json
In this example:
- `main_equipment.json` is the primary equipment file.
- `additional_equipment1.json` and `additional_equipment2.json` are additional equipment files that will be merged into the main library.
- `additional_config1.json` is an additional configuration file that will override the default settings for the amplifiers pointing to it.
**Option**: `--save-network`
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
**Description**: Saves the final network configuration to a specified JSON file.
**Usage**:
.. code-block:: shell-session
--save-network <FILE.json>
**Functionality**: This option allows users to save the network state after the simulation, which can be useful for future reference or analysis.
**Option**: `--save-network-before-autodesign`
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
**Description**: Dumps the network into a JSON file prior to autodesign.
**Usage**:
.. code-block:: shell-session
gnpy-path-request my_network.json my_services.json --save-network-before-autodesign <FILE.json>
**Functionality**: This option is useful for users who want to inspect the network configuration before any automatic design adjustments are made.
**Option**: `--sim-params`
~~~~~~~~~~~~~~~~~~~~~~~~~~
**Description**: Path to the JSON file containing simulation parameters.
**Usage**:
.. code-block:: shell-session
gnpy-transmission-example my_network.json --sim-params <FILE.json>
**Functionality**: The `--sim-params` option is a command-line argument available in GNPy that allows users to specify a
JSON file containing simulation parameters. This option is crucial for customizing the behavior of the simulation:
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.
The tuning of the parameters is detailed here: :ref:`json input sim-params<sim-params>`.
`gnpy-transmission-example` options
-----------------------------------
**Option**: `--show-channels`
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
**Description**: Displays the final per-channel OSNR and GSNR summary.
**Usage**:
.. code-block:: shell-session
gnpy-transmission-example my_network.json --show-channels
**Functionality**: This option provides a summary of the optical signal-to-noise ratio (OSNR)
and generalized signal-to-noise ratio (GSNR) for each channel after the simulation.
**Option**: `-pl`, `--plot`
~~~~~~~~~~~~~~~~~~~~~~~~~~~
**Description**: Generates plots of the results.
**Usage**:
.. code-block:: shell-session
gnpy-transmission-example my_network.json -pl
**Functionality**: This option allows users to visualize the results of the simulation through graphical plots.
**Option**: `-l`, `--list-nodes`
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
**Description**: Lists all transceiver nodes in the network.
**Usage**:
.. code-block:: shell-session
gnpy-transmission-example my_network.json -l
**Functionality**: This option provides a quick way to view all transceiver nodes present in the network topology.
**Option**: `-po`, `--power`
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
**Description**: Specifies the reference channel power in span in dBm.
**Usage**:
.. code-block:: shell-session
gnpy-transmission-example my_network.json -po <value>
**Functionality**: This option allows users to set the input power level for the reference channel used in the simulation.
It replaces the value specified in the `SI` section of the equipment library (:ref:`power_dbm<spectral_info>`).
**Option**: `--spectrum`
~~~~~~~~~~~~~~~~~~~~~~~~
**Description**: Specifies a user-defined mixed rate spectrum JSON file for propagation.
**Usage**:
.. code-block:: shell-session
gnpy-transmission-example my_network.json --spectrum <FILE.json>
**Functionality**: This option allows users to define a custom spectrum for the simulation, which can
include varying channel rates and configurations. More details here: :ref:`mixed-rate<mixed-rate>`.
Options for `path_requests_run`
-------------------------------
The `gnpy-path-request` script provides a simple path computation function that supports routing, transceiver mode selection, and spectrum assignment.
It supports include and disjoint constraints for the path computation, but does not provide any optimisation.
It requires two mandatory arguments: network file and service file (see :ref:`XLS files<excel-service-sheet>` or :ref:`JSON files<legacy-json>`).
The `gnpy-path-request` computes:
- design network once and propagate the service requests on this design
- computes performance of each request defined in the service file independently from each other, considering full load (based on the request settings),
- assigns spectrum for each request according to the remaining spectrum, on a first arrived first served basis.
Lack of spectrum leads to blocking, but performance estimation is still returned for information.
**Option**: `-bi`, `--bidir`
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
**Description**: Indicates that all demands are bidirectional.
**Usage**:
.. code-block:: shell-session
gnpy-path-request my_network.json my_service.json -e my_equipment.json -bi
**Functionality**: This option allows users to specify that the performance of the service requests should be
computed in both directions (source to destination and destination to source). This forces the 'bidirectional'
attribute to true in the service file, possibly affecting feasibility if one direction is not feasible.
**Option**: `-o`, `--output`
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
**Description**: Stores computation results requests into a JSON or CSV file.
**Usage**:
.. code-block:: shell-session
gnpy-path-request my_network.json my_service.json -o <FILE.json|FILE.csv>
**Functionality**: This option allows users to save the results of the path requests into a specified output file
for further analysis.
**Option**: `--redesign-per-request`
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
**Description**: Redesigns the network for each request using the request as the reference channel
(replaces the `SI` section of the equipment library with the request specifications).
**Usage**:
.. code-block:: shell-session
gnpy-path-request my_network.json my_services.json --redesign-per-request
**Functionality**: This option enables checking different scenarios for design.

View File

@@ -114,10 +114,6 @@ and a fiber span from node3 to node6::
If filled they must contain strings with the same constraint as "City" names. Its value is used to differenate links having the same end points. In this case different Id should be used. Cable Ids are not meant to be unique in general.
(in progress)
.. _excel-equipment-sheet:
Eqpt sheet
@@ -192,7 +188,42 @@ This generates a text file meshTopologyExampleV2_eqt_sheet.txt whose content ca
- **delta_p**, in dBm, is not mandatory. If filled it is used to set the output target power per channel at the output of the amplifier, if power_mode is True. The output power is then set to power_dbm + delta_power.
# to be completed #
.. _excel-roadms-sheet:
Roadms sheet
------------
The ROADM sheet (named "Roadms") is optional.
If provided, it can be used to specify:
- per channel power target on a specific ROADM degree (*per_degree_pch_out_db*),
- ROADM type variety,
- impairment ID (identifier) on a particular ROADM path (from degree - to degree).
This sheet contains six columns:
Node A ; Node Z ; per degree target power (dBm) ; type_variety ; from degrees ; from degree to degree impairment id
- **Node A** is mandatory. Name of the ROADM node (as listed in Nodes sheet).
Must be a 'ROADM' (Type attribute in Node sheet), its number of occurence may be equal to its degree.
- **Node Z** is mandatory. Egress direction from the *Node A* ROADM site. Multiple Links between the same Node A
and NodeZ is not supported.
- **per degree target power (dBm)** (optional).
If filled it must contain a value in dBm corresponding to :ref:`per_degree_pch_out_db<roadm_json_instance>` on the **Node Z** degree.
Defaults to equipment library value if not filled.
- **type_variety** (optional). Must be the same for all ROADM entries if filled,
and defined in the :ref:`equipment library<roadm>`. Defaults to 'default' if not filled.
- **from degrees** (optional): List of Node names separated by ' | '. Names must be present in Node sheet.
Together with Node Z, they define a list of internal path in ROADM for which the impairment ID applies
- **from degree to degree impairment id** (optional):List of impairment IDs separated by ' | '. Must be filled
if **from degrees** is defined.
The impairment ID must be defined in the equipment library and be of "express" type.
(in progress)

View File

@@ -91,7 +91,8 @@ Advanced Specification
**********************
The amplifier performance can be further described in terms of gain ripple, NF ripple, and the dynamic gain tilt.
When provided, the amplifier characteristic is fine-tuned as a function of carrier frequency.
When provided, the amplifier characteristic is fine-tuned as a function of carrier frequency. Note that in this advanced
specification tilt is defined vs frequency while tilt_target specified in EDFA instances is defined vs wavelength.
.. _extending-raman:
@@ -119,38 +120,32 @@ A *mode* usually refers to a particular performance point that is defined by a c
The following data are required for each mode:
``bit-rate``
Data bit rate, in :math:`\text{Gbits}\times s^{-1}`.
``baud-rate``
Symbol modulation rate, in :math:`\text{Gbaud}`.
``required-osnr``
Minimal allowed OSNR for the receiver.
``bit_rate``
Data bit rate, in :math:`\text{bits}\times s^{-1}`.
``baud_rate``
Symbol modulation rate, in :math:`\text{baud}`.
``OSNR``
Minimal required OSNR for the receiver. In :math:`\text{dB}`
``tx-osnr``
Initial OSNR at the transmitter's output.
``grid-spacing``
Initial OSNR at the transmitter's output. In :math:`\text{dB}`
``min-spacing``
Minimal grid spacing, i.e., an effective channel spectral bandwidth.
In :math:`\text{Hz}`.
``tx-roll-off``
``roll-off``
Roll-off parameter (:math:`\beta`) of the TX pulse shaping filter.
This assumes a raised-cosine filter.
``rx-power-min`` and ``rx-power-max``
The allowed range of power at the receiver.
(work in progress) The allowed range of power at the receiver.
In :math:`\text{dBm}`.
``cd-max``
Maximal allowed Chromatic Dispersion (CD).
In :math:`\text{ps}/\text{nm}`.
``pmd-max``
Maximal allowed Polarization Mode Dispersion (PMD).
In :math:`\text{ps}`.
``cd-penalty``
*Work-in-progress.*
Describes the increase of the requires GSNR as the :abbr:`CD (Chromatic Dispersion)` deteriorates.
``dgd-penalty``
*Work-in-progress.*
Describes the increase of the requires GSNR as the :abbr:`DGD (Differential Group Delay)` deteriorates.
``pmd-penalty``
*Work-in-progress.*
Describes the increase of the requires GSNR as the :abbr:`PMD (Polarization Mode Dispersion)` deteriorates.
``penalties``
Impairments such as Chromatic Dispersion (CD), Polarization Mode Dispersion (PMD), and Polarization Dispersion Loss (PDL)
result in penalties at the receiver. The receiver's ability to handle these impairments can be defined for each mode as
a list of {impairment: in defined units, 'penalty_value' in dB} (see `transceiver section here <json.rst#_transceiver>`).
Maximum allowed CD, maximum allowed PMD, and maximum allowed PDL should be listed there with corresponding penalties.
Impairments experienced during propagation are linearly interpolated between given points to obtain the corresponding penalty.
The accumulated penalties are subtracted from the path GSNR before comparing with the minimum required OSNR.
Impairments: PMD in :math:`\text{ps}`, CD in :math:`\text{ps/nm}`, PDL in :math:`\text{dB}`, penalty_value in :math:`\text{dB}`
GNPy does not directly track the FEC performance, so the type of chosen FEC is likely indicated in the *name* of the selected transponder mode alone.
@@ -168,6 +163,7 @@ The set of parameters for each ROADM model therefore includes:
Per-channel target TX power towards the egress amplifier.
Within GNPy, a ROADM is expected to attenuate any signal that enters the ROADM node to this level.
This can be overridden on a per-link in the network topology.
Targets can be set using power or power spectral density (see `roadm section here <json.rst#__roadm>`)
``pmd``
Polarization mode dispersion (PMD) penalty of the express path.
In :math:`\text{ps}`.

View File

@@ -7,3 +7,4 @@
.. automodule:: gnpy.tools.json_io
.. automodule:: gnpy.tools.plots
.. automodule:: gnpy.tools.service_sheet
.. automodule:: gnpy.tools.worker_utils

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 478 KiB

View File

@@ -11,13 +11,17 @@ in real-world mesh optical networks. It is based on the Gaussian Noise Model.
intro
concepts
install
cli_options
amplifier_models_description
json
json_instance_examples
excel
extending
about-project
model
gnpy-api
release-notes
publications
Indices and tables
==================

View File

@@ -14,28 +14,29 @@ fully-functional programs.
specific, delineated use cases to drive requirements for future
development.*
This example demonstrates how GNPy can be used to check the expected SNR at the end of the line by varying the channel input power:
This example demonstrates how GNPy can be used to check the expected SNR at the end of the line by varying the channel input power,
or to run a planning script to check SNR of several services:
.. image:: https://telecominfraproject.github.io/oopt-gnpy/docs/images/transmission_main_example.svg
.. image:: images/gnpy-transmission-example.svg
:width: 100%
:align: left
:alt: Running a simple simulation example
By default, this script operates on a single span network defined in
`gnpy/example-data/edfa_example_network.json <gnpy/example-data/edfa_example_network.json>`_
By default, the gnpy-transmission-example script operates on a single span network defined in
`gnpy/example-data/edfa_example_network.json <../gnpy/example-data/edfa_example_network.json>`_
You can specify a different network at the command line as follows. For
example, to use the CORONET Global network defined in
`gnpy/example-data/CORONET_Global_Topology.json <gnpy/example-data/CORONET_Global_Topology.json>`_:
`gnpy/example-data/CORONET_Global_Topology.json <../gnpy/example-data/CORONET_Global_Topology.json>`_:
.. code-block:: shell-session
$ gnpy-transmission-example $(gnpy-example-data)/CORONET_Global_Topology.json
It is also possible to use an Excel file input (for example
`gnpy/example-data/CORONET_Global_Topology.xls <gnpy/example-data/CORONET_Global_Topology.xls>`_).
`gnpy/example-data/CORONET_Global_Topology.xls <../gnpy/example-data/CORONET_Global_Topology.xls>`_).
The Excel file will be processed into a JSON file with the same prefix.
Further details about the Excel data structure are available `in the documentation <docs/excel.rst>`__.
Further details about the Excel data structure are available `in the documentation <excel.rst>`__.
The main transmission example will calculate the average signal OSNR and SNR
across network elements (transceiver, ROADMs, fibers, and amplifiers)
@@ -56,10 +57,10 @@ interference noise.
Further Instructions for Use
----------------------------
Simulations are driven by a set of `JSON <docs/json.rst>`__ or `XLS <docs/excel.rst>`__ files.
Simulations are driven by a set of `JSON <json.rst>`__ or `XLS <excel.rst>`__ files.
The ``gnpy-transmission-example`` script propagates a spectrum of channels at 32 Gbaud, 50 GHz spacing and 0 dBm/channel.
Launch power can be overridden by using the ``--power`` argument.
Launch power in fiber spans can be overridden by using the ``--power`` argument.
Spectrum information is not yet parametrized but can be modified directly in the ``eqpt_config.json`` (via the ``SpectralInformation`` -SI- structure) to accommodate any baud rate or spacing.
The number of channel is computed based on ``spacing`` and ``f_min``, ``f_max`` values.
@@ -71,8 +72,8 @@ An experimental support for Raman amplification is available:
$(gnpy-example-data)/raman_edfa_example_network.json \
--sim $(gnpy-example-data)/sim_params.json --show-channels
Configuration of Raman pumps (their frequencies, power and pumping direction) is done via the `RamanFiber element in the network topology <gnpy/example-data/raman_edfa_example_network.json>`_.
General numeric parameters for simulation control are provided in the `gnpy/example-data/sim_params.json <gnpy/example-data/sim_params.json>`_.
Configuration of Raman pumps (their frequencies, power and pumping direction) is done via the `RamanFiber element in the network topology <../gnpy/example-data/raman_edfa_example_network.json>`_.
General numeric parameters for simulation control are provided in the `gnpy/example-data/sim_params.json <../gnpy/example-data/sim_params.json>`_.
Use ``gnpy-path-request`` to request several paths at once:
@@ -82,7 +83,7 @@ Use ``gnpy-path-request`` to request several paths at once:
$ gnpy-path-request -o output_file.json \
meshTopologyExampleV2.xls meshTopologyExampleV2_services.json
This program operates on a network topology (`JSON <docs/json.rst>`__ or `Excel <docs/excel.rst>`__ format), processing the list of service requests (JSON or XLS again).
This program operates on a network topology (`JSON <json.rst>`__ or `Excel <excel.rst>`__ format), processing the list of service requests (JSON or XLS again).
The service requests and reply formats are based on the `draft-ietf-teas-yang-path-computation-01 <https://tools.ietf.org/html/draft-ietf-teas-yang-path-computation-01>`__ with custom extensions (e.g., for transponder modes).
An example of the JSON input is provided in file `service-template.json`, while results are shown in `path_result_template.json`.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

24
docs/publications.rst Normal file
View File

@@ -0,0 +1,24 @@
.. _publications:
Publications
============
Below is a chronological list of notable publications that emerged from the PSE group's collaborative work.
These articles detail the evolution of GNPy and confirm its performance through experimental trials:
- `G. Grammel, V. Curri, and J. Auge, "Physical Simulation Environment of The Telecommunications Infrastructure Project (TIP)," in Optical Fiber Communication Conference, OSA Technical Digest (online) (Optica Publishing Group, 2018), paper M1D.3. <https://opg.optica.org/abstract.cfm?uri=OFC-2018-M1D.3>`_
- `B. D. Taylor, G. Goldfarb, S. Bandyopadhyay, V. Curri, and H. Schmidtke, "Towards a Route Planning Tool for Open Optical Networks in the Telecom Infrastructure Project," in Optical Fiber Communication Conference, OSA Technical Digest (online) (Optica Publishing Group, 2018), paper Tu3E.4. <https://opg.optica.org/abstract.cfm?uri=OFC-2018-Tu3E.4>`_
- `M. Filer, M. Cantono, A. Ferrari, G. Grammel, G. Galimberti, and V. Curri, "Multi-Vendor Experimental Validation of an Open Source QoT Estimator for Optical Networks," J. Lightwave Technol. 36, 3073-3082 (2018). <https://opg.optica.org/jlt/abstract.cfm?uri=jlt-36-15-3073>`_
- `J. Auge, G. Grammel, E. le Rouzic, V. Curri, G. Galimberti, and J. Powell, "Open optical network planning demonstration," in Optical Fiber Communication Conference (OFC) 2019, OSA Technical Digest (Optica Publishing Group, 2019), paper M3Z.9. <https://opg.optica.org/abstract.cfm?uri=OFC-2019-M3Z.9>`_
- `J. Kundrát, A. Campanella, E. Le Rouzic, A. Ferrari, O. Havliš, M. Hažlinský, G. Grammel, G. Galimberti, and V. Curri, "Physical-Layer Awareness: GNPy and ONOS for End-to-End Circuits in Disaggregated Networks," in Optical Fiber Communication Conference (OFC) 2020, OSA Technical Digest (Optica Publishing Group, 2020), paper M3Z.17. <https://opg.optica.org/abstract.cfm?uri=ofc-2020-m3z.17>`_
- `A. Ferrari, M. Filer, K. Balasubramanian, Y. Yin, E. Le Rouzic, J. Kundrát, G. Grammel, G. Galimberti, and V. Curri, "Experimental Validation of an Open Source Quality of Transmission Estimator for Open Optical Networks," in Optical Fiber Communication Conference (OFC) 2020, OSA Technical Digest (Optica Publishing Group, 2020), paper W3C.2. <https://opg.optica.org/abstract.cfm?uri=ofc-2020-W3C.2>`_
- `A. Ferrari, M. Filer, K. Balasubramanian, Y. Yin, E. Le Rouzic, J. Kundrát, G. Grammel, G. Galimberti, and V. Curri, "GNPy: an open source application for physical layer aware open optical networks," J. Opt. Commun. Netw. 12, C31-C40 (2020). <https://opg.optica.org/jocn/fulltext.cfm?uri=jocn-12-6-C31&id=429003>`_
- `A. Ferrari, K. Balasubramanian, M. Filer, Y. Yin, E. Le Rouzic, J. Kundrát, G. Grammel, G. Galimberti, and V. Curri, "Softwarized Optical Transport QoT in Production Optical Network: a Brownfield Validation," 2020 European Conference on Optical Communications (ECOC), Brussels, Belgium, 2020. <https://ieeexplore.ieee.org/document/9333280>`_
- `A. Ferrari, K. Balasubramanian, M. Filer, Y. Yin, E. Le Rouzic, J. Kundrát, G. Grammel, G. Galimberti, and V. Curri, "Assessment on the in-field lightpath QoT computation including connector loss uncertainties," in Journal of Optical Communications and Networking, vol. 13, no. 2, pp. A156-A164, February 2021. <https://ieeexplore.ieee.org/document/9308057>`_
- `J. Kundrát, E. Le Rouzic, J. Mårtensson, A. Campanella, O. Havliš, A. DAmico, G. Grammel, G. Galimberti, V. Curri, and J. Vojtěch, "GNPy & YANG: Open APIs for End-to-End Service Provisioning in Optical Networks," in Optical Fiber Communication Conference (OFC) 2021, P. Dong, J. Kani, C. Xie, R. Casellas, C. Cole, and M. Li, eds., OSA Technical Digest (Optica Publishing Group, 2021), paper M1B.6. <https://opg.optica.org/abstract.cfm?uri=ofc-2021-M1B.6>`_
- `A. DAmico, E. London, B. Le Guyader, F. Frank, E. Le Rouzic, E. Pincemin, N. Brochier, and V. Curri, "GNPy experimental validation on flex-grid, flex-rate WDM optical transport scenarios," in Optical Fiber Communication Conference (OFC) 2021, P. Dong, J. Kani, C. Xie, R. Casellas, C. Cole, and M. Li, eds., OSA Technical Digest (Optica Publishing Group, 2021), paper W1G.2. <https://opg.optica.org/abstract.cfm?uri=ofc-2021-W1G.2>`_
- `E. Virgillito, R. Braun, D. Breuer, A. Gladisch, V. Curri, and G. Grammel, "Testing TIP Open Source Solutions in Deployed Optical Networks," in Optical Fiber Communication Conference (OFC) 2021, P. Dong, J. Kani, C. Xie, R. Casellas, C. Cole, and M. Li, eds., OSA Technical Digest (Optica Publishing Group, 2021), paper F1C.3. <https://opg.optica.org/abstract.cfm?uri=ofc-2021-F1C.3>`_
- `A. DAmico, E. London, B. Le Guyader, F. Frank, E. Le Rouzic, E. Pincemin, N. Brochier, and V. Curri, "Experimental validation of GNPy in a multi-vendor flex-grid flex-rate WDM optical transport scenario," J. Opt. Commun. Netw. 14, 79-88 (2022). <https://opg.optica.org/jocn/fulltext.cfm?uri=jocn-14-3-79&id=466355>`_
- `J. Kundrát, E. Le Rouzic, J. Mårtensson, S. Melin, A. DAmico, G. Grammel, G. Galimberti, and V. Curri, "GNPy: Lessons Learned and Future Plans [Invited]," in European Conference on Optical Communication (ECOC) 2022, J. Leuthold, C. Harder, B. Offrein, and H. Limberger, eds., Technical Digest Series (Optica Publishing Group, 2022), paper We3B.6. <https://opg.optica.org/abstract.cfm?uri=ECEOC-2022-We3B.6>`_
- `G. Grammel, J. Kundrat, E. Le Rouzic, S. Melin, V. Curri, A. D'Amico, R. Manzotti, "Open Optical Networks: the good, the bad and the ugly," 49th European Conference on Optical Communications (ECOC 2023), Hybrid Conference, Glasgow, UK, 2023. <https://ieeexplore.ieee.org/document/10484723>`_
- `A. DAmico, V. Gatto, A. Nespola, G. Borraccini, Y. Jiang, P. Poggiolini, E. Le Rouzic, A. M. L. de Lerma, G. Grammel, R. Manzotti, V. Curri, "GNPy Experimental Validation in a C+L Multiband Optical Multiplex Section," 2024 24th International Conference on Transparent Optical Networks (ICTON), Bari, Italy, 2024. <https://ieeexplore.ieee.org/document/10648172>`_

View File

@@ -5,6 +5,359 @@ Release change log
Each release introduces some changes and new features.
(prepare text for next release)
**Important Changes:**
The default values for EDFA configuration, including frequency range, gain ripple, noise figure ripple, or dynamic gain tilt
are now hardcoded in parameters.py and are no longer read from the default_edfa_config.json file (the file has been removed).
However, users can define their own custom parameters using the default_config_from_json variable, which should be populated with a file name containing the desired parameter description. This applies to both variable_gain and fixed_gain amplifier types.
This change streamlines the configuration process but requires users to explicitly set parameters through the new
model if the default values do not suit their needs.
v2.11
-----
**New feature**
A new type_def for amplifiers has been introduced: multi_band. This allows the definition of a
multiband amplifier site composed of several amplifiers per band (a typical application is C+L transmission). The
release also includes autodesign for links (Optical Multiplex Section, OMS) composed of multi_band amplifiers.
Multi_band autodesign includes basic tilt and tilt_target calculation when the Raman flag is enabled with the
--sim-params option. The spectrum is demultiplexed before propagation in the amplifier and multiplexed in the output
fiber at the amplifier output.
In the library:
.. code-block:: json
{
"type_variety": "std_medium_gain_C",
"f_min": 191.225e12,
"f_max": 196.125e12,
"type_def": "variable_gain",
"gain_flatmax": 26,
"gain_min": 15,
"p_max": 21,
"nf_min": 6,
"nf_max": 10,
"out_voa_auto": false,
"allowed_for_design": false
},
{
"type_variety": "std_medium_gain_L",
"f_min": 186.5e12,
"f_max": 190.1e12,
"type_def": "variable_gain",
"gain_flatmax": 26,
"gain_min": 15,
"p_max": 21,
"nf_min": 6,
"nf_max": 10,
"out_voa_auto": false,
"allowed_for_design": true
},
{
"type_variety": "std_medium_gain_multiband",
"type_def": "multi_band",
"amplifiers": [
"std_medium_gain_C",
"std_medium_gain_L"
],
"allowed_for_design": false
},
In the network topology:
.. code-block:: json
{
"uid": "east edfa in Site_A to Site_B",
"type": "Multiband_amplifier",
"type_variety": "std_medium_gain_multiband",
"amplifiers": [{
"type_variety": "std_medium_gain_C",
"operational": {
"gain_target": 22.55,
"delta_p": 0.9,
"out_voa": 3.0,
"tilt_target": 0.0
}
}, {
"type_variety": "std_medium_gain_L",
"operational": {
"gain_target": 21,
"delta_p": 3.0,
"out_voa": 3.0,
"tilt_target": 0.0
}
}
]
}
**Network design**
Optionally, users can define a design target per OMS (single or multi-band), with specific frequency ranges.
Default design bands are defined in the SI.
.. code-block:: json
{
"uid": "roadm Site_A",
"type": "Roadm",
"params": {
"target_pch_out_db": -20,
"design_bands": [{"f_min": 191.3e12, "f_max": 195.1e12}]
}
}
It is possible to define a set of bands in the SI block instead of a single Spectrum Information.
In this case type_variety must be used.
Each set defines a reference channel used for design functions and autodesign.
The default design settings for the path-request-run script have been modified.
Now, design is performed once for the reference channel defined in the SI block of the eqpt_config,
and requests are propagated based on this design.
The --redesign-per-request option can be used to restore previous behaviour
(design using request channel types).
The autodesign function has been updated to insert multiband booster, preamp or inline amplifiers based on the OMS
nature. If nothing is stated (no amplifier defined in the OMS, no design_bands attribute in the ROADM), then
it uses single band Edfas.
**Propagation**
Only carriers within the amplifier bandwidth are propagated, improving system coherence. This more rigorous checking
of the spectrum to be propagated and the amplifier bandwidth may lead to changes in the total number of channels
compared to previous releases. The range can be adjusted by changing the values of ``f_min`` and ``f_max``
in the amplifier library.
``f_min`` and ``f_max`` represent the boundary frequencies of the amplification bandwidth (the entire channel must fit
within this range).
In the example below, a signal center frequency of 190.05THz with a 50GHz width cannot fit within the amplifier band.
Note that this has a different meaning in the SI or Transceiver blocks, where ``f_min`` and ``f_max`` refers to the
minimum / maximum values of the carrier center frequency.
.. code-block:: json
{
"type_variety": "std_booster_L",
"f_min": 186.55e12,
"f_max": 190.05e12,
"type_def": "fixed_gain",
"gain_flatmax": 21,
"gain_min": 20,
"p_max": 21,
"nf0": 5,
"allowed_for_design": false
}
**Display**
The CLI output for the transmission_main_example now displays the channels used for design and simulation,
as well as the tilt target of amplifiers.
.. code-block:: text
Reference used for design: (Input optical power reference in span = 0.00dBm,
spacing = 50.00GHz
nb_channels = 76)
Channels propagating: (Input optical power deviation in span = 0.00dB,
spacing = 50.00GHz,
transceiver output power = 0.00dBm,
nb_channels = 76)
The CLI output displays the settings of each amplifier:
.. code-block:: text
Multiband_amplifier east edfa in Site_A to Site_B
type_variety: std_medium_gain_multiband
type_variety: std_medium_gain_C type_variety: std_medium_gain_L
effective gain(dB): 20.90 effective gain(dB): 22.19
(before att_in and before output VOA) (before att_in and before output VOA)
tilt-target(dB) 0.00 tilt-target(dB) 0.00
noise figure (dB): 6.38 noise figure (dB): 6.19
(including att_in) (including att_in)
pad att_in (dB): 0.00 pad att_in (dB): 0.00
Power In (dBm): -1.08 Power In (dBm): -1.49
Power Out (dBm): 19.83 Power Out (dBm): 20.71
Delta_P (dB): 0.90 Delta_P (dB): 2.19
target pch (dBm): 0.90 target pch (dBm): 3.00
actual pch out (dBm): -2.09 actual pch out (dBm): -0.80
output VOA (dB): 3.00 output VOA (dB): 3.00
**New feature**
The preturbative Raman and the approximated GGN models are introduced for a faster evaluation of the Raman and
Kerr effects, respectively.
These implementation are intended to reduce the computational effort required by multiband transmission scenarios.
Both the novel models have been validated with exstensive simulations
(see `arXiv:2304.11756 <https://arxiv.org/abs/2304.11756>`_ for the new Raman model and
`jlt:9741324 <https://eeexplore.ieee.org/document/9741324>`_ for the new NLI model).
Additionally, they have been experimentally validated in a laboratory setup composed of commertial equipment
(see `icton:10648172 <https://eeexplore.ieee.org/document/10648172>`_).
v2.10
-----
ROADM impairments can be defined per degree and roadm-path type (add, drop or express).
Minimum loss when crossing a ROADM is no more 0 dB. It can be set per ROADM degree with roadm-path-impairments.
The transceiver output power, which was previously set using the same parameter as the input span power (power_dbm),
can now be set using a different parameter. It can be set as:
- for all channels, with tx_power_dbm using SI similarly to tx_osnr (gnpy-transmission-example script)
.. code-block:: json
"SI": [{
"f_min": 191.35e12,
"baud_rate": 32e9,
"f_max": 196.1e12,
"spacing": 50e9,
"power_dbm": 3,
"power_range_db": [0, 0, 1],
"roll_off": 0.15,
"tx_osnr": 40,
"tx_power_dbm": -10,
"sys_margins": 2
}
]
- for certain channels, using -spectrum option and tx_channel_power_dbm option (gnpy-transmission-example script).
.. code-block:: json
{
"spectrum": [
{
"f_min": 191.35e12,
"f_max":193.1e12,
"baud_rate": 32e9,
"slot_width": 50e9,
"power_dbm": 0,
"roll_off": 0.15,
"tx_osnr": 40
},
{
"f_min": 193.15e12,
"f_max":193.15e12,
"baud_rate": 32e9,
"slot_width": 50e9,
"power_dbm": 0,
"roll_off": 0.15,
"tx_osnr": 40,
"tx_power_dbm": -10
},
{
"f_min": 193.2e12,
"f_max":195.1e12,
"baud_rate": 32e9,
"slot_width": 50e9,
"power_dbm": 0,
"roll_off": 0.15,
"tx_osnr": 40
}
]
}
- per service using the additional parameter ``tx_power`` which similarly to ``power`` should be defined in Watt (gnpy-path-request script)
.. code-block:: json
{
"path-request": [
{
"request-id": "0",
"source": "trx SITE1",
"destination": "trx SITE2",
"src-tp-id": "trx SITE1",
"dst-tp-id": "trx SITE2",
"bidirectional": false,
"path-constraints": {
"te-bandwidth": {
"technology": "flexi-grid",
"trx_type": "Voyager",
"trx_mode": "mode 1",
"spacing": 50000000000.0,
"path_bandwidth": 100000000000.0
}
}
},
{
"request-id": "0 with tx_power",
"source": "trx SITE1",
"destination": "trx SITE2",
"src-tp-id": "trx SITE1",
"dst-tp-id": "trx SITE2",
"bidirectional": false,
"path-constraints": {
"te-bandwidth": {
"technology": "flexi-grid",
"trx_type": "Voyager",
"trx_mode": "mode 1",
"tx_power": 0.0001,
"spacing": 50000000000.0,
"path_bandwidth": 100000000000.0
}
}
}
]
}
v2.9
----
The revision introduces a major refactor that separates design and propagation. Most of these changes have no impact
on the user experience, except the following ones:
**Network design - amplifiers**: amplifier saturation is checked during design in all cases, even if type_variety is
set; amplifier gain is no more computed on the fly but only at design phase.
Before, the design did not consider amplifier power saturation during design if amplifier type_variety was stated.
With this revision, the saturation is always applied:
If design is made for a per channel power that leads to saturation, the target are properly reduced and the design
is freezed. So that when a new simulation is performed on the same network for lower levels of power per channel
the same gain target is applied. Before these were recomputed, changing the gain targets, so the simulation was
not considering the exact same working points for amplifiers in case of saturation.
Note that this case (working with saturation settings) is not recommended.
The gain of amplifiers was estimated on the fly also in case of RamanFiber preceding elements. The refactor now
requires that an estimation of Raman gain of the RamanFiber is done during design to properly compute a gain target.
The Raman gain is estimated at design for every RamanFiber span and also during propagation instead of being only
estimated at propagation stage for those Raman Fiber spans concerned with the transmission. The auto-design is more
accurate for unpropagated spans, but this results in an increase overall computation time.
This will be improved in the future.
**Network design - ROADMs**: ROADM target power settings are verified during design.
Design checks that expected power coming from every directions ingress from a ROADM are consistent with output power
targets. The checks only considers the adjacent previous hop. If the expected power at the input of this ROADM is
lower than the target power on the out-degree of the ROADM, a warning is displayed, and user is asked to review the
input network to avoid this situation. This does not change the design or propagation behaviour.
**Propagation**: amplifier gain target is no more recomputed during propagation. It is now possible to freeze
the design and propagate without automatic changes.
In previous release, gain was recomputed during propagation based on an hypothetical reference noiseless channel
propagation. It was not possible to «freeze» the autodesign, and propagate without recomputing the gain target
of amplifiers.
With this new release, the design is freezed, so that it is possible to compare performances on same basis.
**Display**: "effective pch (dbm)" is removed. Display contains the target pch which is the target power per channel
in dBm, computed based on reference channel used for design and the amplifier delta_p in dB (and before out VOA
contribution). Note that "actual pch out (dBm)" is the actual propagated total power per channel averaged per spectrum
band definition at the output of the amplifier element, including noises and out VOA contribution.
v2.8
----
@@ -61,8 +414,30 @@ instead of
**change in display**: only warnings are displayed ; information are disabled and needs the -v (verbose)
option to be displayed on standard output.
**frequency scaling**: Chromatic dispersion, effective area, Raman Gain coefficient,
and nonlinear coefficient can now be defined with a scaling along frequency.
**frequency scaling**: A more accurate description of fiber parameters is implemented, including frequency scaling of
chromatic dispersion, effective area, Raman gain coefficient, and nonlinear coefficient.
In particular:
1. Chromatic dispersion can be defined with ``'dispersion'`` and ``'dispersion_slope'``, as in previous versions, or
with ``'dispersion_per_frequency'``; the latter must be defined as a dictionary with two keys, ``'value'`` and
``'frequency'`` and it has higher priority than the entries ``'dispersion'`` and ``'dispersion_slope'``.
Essential change: In previous versions, when it was not provided the ``'dispersion_slope'`` was calculated in an
involute manner to get a vanishing beta3 , and this was a mere artifact for NLI evaluation purposes (namely to evaluate
beta2 and beta3, not for total dispersion accumulation). Now, the evaluation of beta2 and beta3 is performed explicitly
in the element.py module.
2. The effective area is provided as a scalar value evaluated at the Fiber reference frequency and properly scaled
considering the Fiber refractive indices n1 and n2, and the core radius. These quantities are assumed to be fixed and
are hard coded in the parameters.py module. Essential change: The effective area is always scaled along the frequency.
3. The Raman gain coefficient is properly scaled considering the overlapping of fiber effective area values scaled at
the interacting frequencies. Essential change: In previous version the Raman gain coefficient depends only on
the frequency offset.
4. The nonlinear coefficient ``'gamma'`` is properly scaled considering the refractive index n2 and the scaling
effective area. Essential change: As the effective area, the nonlinear coefficient is always scaled along the
frequency.
**power offset**: Power equalization now enables defining a power offset in transceiver library to represent
the deviation from the general equalisation strategy defined in ROADMs.

View File

@@ -5,12 +5,12 @@
gnpy.core.elements
==================
Standard network elements which propagate optical spectrum
Standard network elements which propagate optical spectrum.
A network element is a Python callable. It takes a :class:`.info.SpectralInformation`
object and returns a copy with appropriate fields affected. This structure
represents spectral information that is "propogated" by this network element.
Network elements must have only a local "view" of the network and propogate
represents spectral information that is "propagated" by this network element.
Network elements must have only a local "view" of the network and propagate
:class:`.info.SpectralInformation` using only this information. They should be independent and
self-contained.
@@ -20,19 +20,22 @@ unique identifier and a printable name, and provide the :py:meth:`__call__` meth
instance as a result.
"""
from copy import deepcopy
from numpy import abs, array, errstate, ones, interp, mean, pi, polyfit, polyval, sum, sqrt, log10, exp, asarray, full,\
squeeze, zeros, append, flip, outer, ndarray
squeeze, zeros, outer, ndarray
from scipy.constants import h, c
from scipy.interpolate import interp1d
from collections import namedtuple
from typing import Union
from typing import Union, List
from logging import getLogger
import warnings
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
watt2dbm, psd2powerdbm, calculate_absolute_min_or_zero, nice_column_str
from gnpy.core.parameters import RoadmParams, FusedParams, FiberParams, PumpParams, EdfaParams, EdfaOperational, \
MultiBandParams, RoadmPath, RoadmImpairment, TransceiverParams, find_band_name, FrequencyBand
from gnpy.core.science_utils import NliSolver, RamanSolver
from gnpy.core.info import SpectralInformation, ReferenceCarrier
from gnpy.core.info import SpectralInformation, muxed_spectral_information, demuxed_spectral_information
from gnpy.core.exceptions import NetworkTopologyError, SpectrumError, ParametersError
@@ -79,8 +82,20 @@ class _Node:
class Transceiver(_Node):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
def __init__(self, *args, params=None, **kwargs):
if not params:
params = {}
try:
with warnings.catch_warnings(record=True) as caught_warnings:
super().__init__(*args, params=TransceiverParams(**params), **kwargs)
if caught_warnings:
msg = f'In Transceiver {kwargs["uid"]}: {caught_warnings[0].message}'
_logger.warning(msg)
except ParametersError as e:
msg = f'Config error in {kwargs["uid"]}: {e}'
_logger.critical(msg)
raise ParametersError(msg) from e
self.osnr_ase_01nm = None
self.osnr_ase = None
self.osnr_nli = None
@@ -94,6 +109,9 @@ class Transceiver(_Node):
self.penalties = {}
self.total_penalty = 0
self.propagated_labels = [""]
self.tx_power = None
self.design_bands = self.params.design_bands
self.per_degree_design_bands = self.params.per_degree_design_bands
def _calc_cd(self, spectral_info):
"""Updates the Transceiver property with the CD of the received channels. CD in ps/nm.
@@ -155,6 +173,7 @@ class Transceiver(_Node):
# use raw_values so that the added SNR penalties are not cumulated
snr_added = 0
for s in args:
if s is not None:
snr_added += db2lin(-s)
snr_added = -lin2db(snr_added)
self.osnr_ase = snr_sum(self.raw_osnr_ase, self.baud_rate, snr_added)
@@ -192,6 +211,7 @@ class Transceiver(_Node):
osnr_ase = per_label_average(self.osnr_ase, self.propagated_labels)
osnr_ase_01nm = per_label_average(self.osnr_ase_01nm, self.propagated_labels)
snr_01nm = per_label_average(self.snr_01nm, self.propagated_labels)
tx_power_dbm = per_label_average(watt2dbm(self.tx_power), self.propagated_labels)
cd = mean(self.chromatic_dispersion)
pmd = mean(self.pmd)
pdl = mean(self.pdl)
@@ -205,7 +225,8 @@ class Transceiver(_Node):
f' CD (ps/nm): {cd:.2f}',
f' PMD (ps): {pmd:.2f}',
f' PDL (dB): {pdl:.2f}',
f' Latency (ms): {latency:.2f}'])
f' Latency (ms): {latency:.2f}',
f' Actual pch out (dBm): {pretty_summary_print(tx_power_dbm)}'])
cd_penalty = self.penalties.get('chromatic_dispersion')
if cd_penalty is not None:
@@ -220,6 +241,7 @@ class Transceiver(_Node):
return result
def __call__(self, spectral_info):
self.tx_power = spectral_info.tx_power
self._calc_snr(spectral_info)
self._calc_cd(spectral_info)
self._calc_pmd(spectral_info)
@@ -233,7 +255,11 @@ class Roadm(_Node):
if not params:
params = {}
try:
with warnings.catch_warnings(record=True) as caught_warnings:
super().__init__(*args, params=RoadmParams(**params), **kwargs)
if caught_warnings:
msg = f'In ROADM {kwargs["uid"]}: {caught_warnings[0].message}'
_logger.warning(msg)
except ParametersError as e:
msg = f'Config error in {kwargs["uid"]}: {e}'
raise ParametersError(msg) from e
@@ -242,6 +268,7 @@ class Roadm(_Node):
# on the path, since it depends on the equalization definition on the degree.
self.ref_pch_out_dbm = None
self.loss = 0 # auto-design interest
self.loss_pch_db = None
# Optical power of carriers are equalized by the ROADM, so that the experienced loss is not the same for
# different carriers. The ref_effective_loss records the loss for a reference carrier.
@@ -260,6 +287,19 @@ class Roadm(_Node):
self.per_degree_pch_psw = self.params.per_degree_pch_psw
self.ref_pch_in_dbm = {}
self.ref_carrier = None
# Define the nature of from-to internal connection: express-path, drop-path, add-path
# roadm_paths contains a list of RoadmPath object for each path crossing the ROADM
self.roadm_paths = []
# roadm_path_impairments contains a dictionnary of impairments profiles corresponding to type_variety
# first listed add, drop an express constitute the default
self.roadm_path_impairments = self.params.roadm_path_impairments
# per degree definitions, in case some degrees have particular deviations with respect to default.
self.per_degree_impairments = {f'{i["from_degree"]}-{i["to_degree"]}': {"from_degree": i["from_degree"],
"to_degree": i["to_degree"],
"impairment_id": i["impairment_id"]}
for i in self.params.per_degree_impairments}
self.design_bands = deepcopy(self.params.design_bands)
self.per_degree_design_bands = deepcopy(self.params.per_degree_design_bands)
@property
def to_json(self):
@@ -274,9 +314,10 @@ class Roadm(_Node):
to_json = {
'uid': self.uid,
'type': type(self).__name__,
'type_variety': self.type_variety,
'params': {
equalisation: value,
'restrictions': self.restrictions,
'restrictions': self.restrictions
},
'metadata': {
'location': self.metadata['location']._asdict()
@@ -289,6 +330,14 @@ class Roadm(_Node):
to_json['params']['per_degree_psd_out_mWperGHz'] = self.per_degree_pch_psd
if self.per_degree_pch_psw:
to_json['params']['per_degree_psd_out_mWperSlotWidth'] = self.per_degree_pch_psw
if self.per_degree_impairments:
to_json['params']['per_degree_impairments'] = list(self.per_degree_impairments.values())
if self.params.design_bands is not None:
if len(self.params.design_bands) > 1:
to_json['params']['design_bands'] = self.params.design_bands
if self.params.per_degree_design_bands:
to_json['params']['per_degree_design_bands'] = self.params.per_degree_design_bands
return to_json
def __repr__(self):
@@ -299,10 +348,13 @@ class Roadm(_Node):
return f'{type(self).__name__} {self.uid}'
total_pch = pretty_summary_print(per_label_average(self.pch_out_dbm, self.propagated_labels))
total_loss = pretty_summary_print(per_label_average(self.loss_pch_db, self.propagated_labels))
return '\n'.join([f'{type(self).__name__} {self.uid}',
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}'])
f' Type_variety: {self.type_variety}',
f' Reference loss (dB): {self.ref_effective_loss:.2f}',
f' Actual loss (dB): {total_loss}',
f' Reference pch out (dBm): {self.ref_pch_out_dbm:.2f}',
f' Actual pch out (dBm): {total_pch}'])
def get_roadm_target_power(self, spectral_info: SpectralInformation = None) -> Union[float, ndarray]:
"""Computes the power in dBm for a reference carrier or for a spectral information.
@@ -358,13 +410,18 @@ class Roadm(_Node):
def propagate(self, spectral_info, degree, from_degree):
"""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.
If the input power is lower than the target one, use the input power minus the ROADM loss
if is exists, because a ROADM doesn't amplify, it can only attenuate.
There is no difference for add or express : the same target is applied.
For the moment propagate operates with spectral info carriers all having the same source or destination.
"""
# TODO maybe add a minimum loss for the ROADM
# record input powers to compute the actual loss at the end of the process
input_power_dbm = watt2dbm(spectral_info.signal + spectral_info.nli + spectral_info.ase)
# apply min ROADM loss if it exists
roadm_maxloss_db = self.get_impairment('roadm-maxloss', spectral_info.frequency, from_degree, degree)
spectral_info.apply_attenuation_db(roadm_maxloss_db)
# records the total power after applying minimum loss
net_input_power_dbm = watt2dbm(spectral_info.signal + spectral_info.nli + spectral_info.ase)
# find the target power for the reference carrier
ref_per_degree_pch = self.get_per_degree_ref_power(degree)
# find the target powers for each signal carrier
@@ -374,15 +431,19 @@ class Roadm(_Node):
# Depending on propagation upstream from this ROADM, the input power might be smaller than
# 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(self.ref_pch_in_dbm[from_degree], ref_per_degree_pch)
ref_pch_in_dbm = self.ref_pch_in_dbm[from_degree]
# Calculate the output power for the reference channel (only for visualization)
self.ref_pch_out_dbm = min(ref_pch_in_dbm - max(roadm_maxloss_db), ref_per_degree_pch)
# Definition of effective_loss:
# 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 = self.ref_pch_in_dbm[from_degree] - self.ref_pch_out_dbm
input_power = spectral_info.signal + spectral_info.nli + spectral_info.ase
# Calculate the effective loss for the reference channel
self.ref_effective_loss = ref_pch_in_dbm - self.ref_pch_out_dbm
# Calculate the target power per channel according to the equalization policy
target_power_per_channel = per_degree_pch + spectral_info.delta_pdb_per_channel
# Computation of the per channel target power according to equalization policy
# Computation of the correction according to equalization policy
# If target_power_per_channel has some channels power above input power, then the whole target is reduced.
# For example, if user specifies delta_pdb_per_channel:
# freq1: 1dB, freq2: 3dB, freq3: -3dB, and target is -20dBm out of the ROADM,
@@ -397,17 +458,116 @@ class Roadm(_Node):
# that had the min power.
# 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
correction = calculate_absolute_min_or_zero(net_input_power_dbm - target_power_per_channel)
new_target = target_power_per_channel - correction
delta_power = watt2dbm(input_power) - new_target
delta_power = net_input_power_dbm - new_target
spectral_info.apply_attenuation_db(delta_power)
spectral_info.pmd = sqrt(spectral_info.pmd ** 2 + self.params.pmd ** 2)
spectral_info.pdl = sqrt(spectral_info.pdl ** 2 + self.params.pdl ** 2)
# Update the PMD information
pmd_impairment = self.get_impairment('roadm-pmd', spectral_info.frequency, from_degree, degree)
spectral_info.pmd = sqrt(spectral_info.pmd ** 2 + pmd_impairment ** 2)
# Update the PMD information
pdl_impairment = self.get_impairment('roadm-pdl', spectral_info.frequency, from_degree, degree)
spectral_info.pdl = sqrt(spectral_info.pdl ** 2 + pdl_impairment ** 2)
# Update the per channel power with the result of propagation
self.pch_out_dbm = watt2dbm(spectral_info.signal + spectral_info.nli + spectral_info.ase)
# Update the loss per channel and the labels
self.loss_pch_db = input_power_dbm - self.pch_out_dbm
self.propagated_labels = spectral_info.label
def set_roadm_paths(self, from_degree, to_degree, path_type, impairment_id=None):
"""set internal path type: express, drop or add with corresponding impairment
If no impairment id is defined, then use the first profile that matches the path_type in the
profile dictionnary.
"""
# initialize impairment with params.pmd, params.cd
# if more detailed parameters are available for the Roadm, the use them instead
roadm_global_impairment = {
'impairment': [{
'roadm-pmd': self.params.pmd,
'roadm-pdl': self.params.pdl,
'frequency-range': {
'lower-frequency': None,
'upper-frequency': None
}}]}
if path_type in ['add', 'drop']:
# without detailed imparments, we assume that add OSNR contribution is the same as drop contribution
# add_drop_osnr_db = - 10log10(1/add_osnr + 1/drop_osnr) with add_osnr = drop_osnr
# = add_osnr_db + 10log10(2)
roadm_global_impairment['impairment'][0]['roadm-osnr'] = self.params.add_drop_osnr + lin2db(2)
impairment = RoadmImpairment(roadm_global_impairment)
if impairment_id is None:
# get the first item in the type variety that matches the path_type
for path_impairment_id, path_impairment in self.roadm_path_impairments.items():
if path_impairment.path_type == path_type:
impairment = path_impairment
impairment_id = path_impairment_id
break
# at this point, path_type is not part of roadm_path_impairment, impairment and impairment_id are None
else:
if impairment_id in self.roadm_path_impairments:
impairment = self.roadm_path_impairments[impairment_id]
else:
msg = f'ROADM {self.uid}: impairment profile id {impairment_id} is not defined in library'
raise NetworkTopologyError(msg)
# print(from_degree, to_degree, path_type)
self.roadm_paths.append(RoadmPath(from_degree=from_degree, to_degree=to_degree, path_type=path_type,
impairment_id=impairment_id, impairment=impairment))
def get_roadm_path(self, from_degree, to_degree):
"""Get internal path type impairment"""
for roadm_path in self.roadm_paths:
if roadm_path.from_degree == from_degree and roadm_path.to_degree == to_degree:
return roadm_path
msg = f'Could not find from_degree-to_degree {from_degree}-{to_degree} path in ROADM {self.uid}'
raise NetworkTopologyError(msg)
def get_per_degree_impairment_id(self, from_degree, to_degree):
"""returns the id of the impairment if the degrees are in the per_degree tab"""
if f'{from_degree}-{to_degree}' in self.per_degree_impairments.keys():
return self.per_degree_impairments[f'{from_degree}-{to_degree}']["impairment_id"]
return None
def get_path_type_per_id(self, impairment_id):
"""returns the path_type of the impairment if the is is defined"""
if impairment_id in self.roadm_path_impairments.keys():
return self.roadm_path_impairments[impairment_id].path_type
return None
def get_impairment(self, impairment: str, frequency_array: array, from_degree: str, degree: str) \
-> array:
"""
Retrieves the specified impairment values for the given frequency array.
Parameters:
impairment (str): The type of impairment to retrieve (roadm-pmd, roamd-maxloss...).
frequency_array (array): The frequencies at which to check for impairments.
from_degree (str): The ingress degree for the roadm internal path.
degree (str): The egress degree for the roadm internal path.
Returns:
array: An array of impairment values for the specified frequencies.
"""
result = []
impairment_per_band = self.get_roadm_path(from_degree, degree).impairment.impairments
for frequency in frequency_array:
for item in impairment_per_band:
f_min = item['frequency-range']['lower-frequency']
f_max = item['frequency-range']['upper-frequency']
if (f_min is None or f_min <= frequency <= f_max):
item[impairment] = item.get(impairment, RoadmImpairment.default_values[impairment])
if item[impairment] is not None:
result.append(item[impairment])
break # Stop searching after the first match for this frequency
if result:
return array(result)
def __call__(self, spectral_info, degree, from_degree):
self.propagate(spectral_info, degree=degree, from_degree=from_degree)
return spectral_info
@@ -707,11 +867,16 @@ class RamanFiber(Fiber):
def to_json(self):
return dict(super().to_json, operational=self.operational)
def __str__(self):
return super().__str__() + f'\n reference gain (dB): {round(self.estimated_gain, 2)}' \
+ f'\n actual gain (dB): {round(self.actual_raman_gain, 2)}'
def propagate(self, spectral_info: SpectralInformation):
"""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
pin = watt2dbm(sum(spectral_info.signal))
attenuation_in_db = self.params.con_in + self.params.att_in
spectral_info.apply_attenuation_db(attenuation_in_db)
@@ -741,6 +906,8 @@ class RamanFiber(Fiber):
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
pout = watt2dbm(sum(spectral_info.signal))
self.actual_raman_gain = self.loss + pout - pin
class Edfa(_Node):
@@ -750,8 +917,11 @@ class Edfa(_Node):
if operational is None:
operational = {}
self.variety_list = kwargs.pop('variety_list', None)
try:
super().__init__(*args, params=EdfaParams(**params), operational=EdfaOperational(**operational), **kwargs)
self.interpol_dgt = None # interpolated dynamic gain tilt
except ParametersError as e:
raise ParametersError(f'{kwargs["uid"]}: {e}') from e
self.interpol_dgt = None # interpolated dynamic gain tilt defined per frequency on amp band
self.interpol_gain_ripple = None # gain ripple
self.interpol_nf_ripple = None # nf_ripple
self.channel_freq = None # SI channel frequencies
@@ -774,25 +944,28 @@ class Edfa(_Node):
self.delta_p = self.operational.delta_p
# self._delta_p contains computed delta_p during design even if power_mode is False
self._delta_p = None
self.tilt_target = self.operational.tilt_target
self.tilt_target = self.operational.tilt_target # defined per lambda on the amp band
self.out_voa = self.operational.out_voa
self.propagated_labels = [""]
@property
def to_json(self):
return {'uid': self.uid,
_to_json = {
'uid': self.uid,
'type': type(self).__name__,
'type_variety': self.params.type_variety,
'operational': {
'gain_target': round(self.effective_gain, 6) if self.effective_gain else None,
'delta_p': self.delta_p,
'tilt_target': self.tilt_target,
'tilt_target': round(self.tilt_target, 5) if self.tilt_target is not None else None,
# defined per lambda on the amp band
'out_voa': self.out_voa
},
'metadata': {
'location': self.metadata['location']._asdict()
}
}
return _to_json
def __repr__(self):
return (f'{type(self).__name__}(uid={self.uid!r}, '
@@ -814,7 +987,9 @@ class Edfa(_Node):
return '\n'.join([f'{type(self).__name__} {self.uid}',
f' type_variety: {self.params.type_variety}',
f' effective gain(dB): {self.effective_gain:.2f}',
f' (before att_in and before output VOA)',
' (before att_in and before output VOA)',
f' tilt-target(dB) {self.tilt_target if self.tilt_target else 0:.2f}',
# avoids -0.00 value for tilt_target
f' noise figure (dB): {nf:.2f}',
f' (including att_in)',
f' pad att_in (dB): {self.att_in:.2f}',
@@ -1016,7 +1191,7 @@ class Edfa(_Node):
p = polyfit(self.channel_freq, self.interpol_dgt, 1)
dgt_slope = p[0]
# Calculate the target slope
# Calculate the target slope defined per frequency on the amp band
targ_slope = -self.tilt_target / (self.params.f_max - self.params.f_min)
# first estimate of DGT scaling
@@ -1093,5 +1268,126 @@ class Edfa(_Node):
self.propagated_labels = spectral_info.label
def __call__(self, spectral_info):
# filter out carriers outside the amplifier band
band = next(b for b in self.params.bands)
spectral_info = demuxed_spectral_information(spectral_info, band)
if spectral_info.carriers:
self.propagate(spectral_info)
return spectral_info
raise ValueError(f'Amp {self.uid} Defined propagation band does not match amplifiers band.')
class Multiband_amplifier(_Node):
"""Represents a multiband amplifier that manages multiple amplifiers across different frequency bands.
This class allows for the initialization and management of amplifiers, each associated with a specific
frequency band. It provides methods for signal propagation through the amplifiers and for exporting
to JSON format.
param: amplifiers: list of dict. A list of dictionaries, each containing parameters for setting an
individual amplifier.
param: params : dict. A dictionary of parameters for the multiband amplifier, which must include
necessary configuration settings.
param: args, kwargs: Additional positional and keyword arguments passed to the parent class `_Node`.
Attributes:
-----------
variety_list : A list of varieties associated with the amplifier.
amplifiers : A dictionary mapping band names to their corresponding amplifier instances.
Methods:
--------
__call__(spectral_info):
Propagates the input spectral information through each amplifier and returns the multiplexed spectrum.
to_json:
Converts the amplifier's state to a JSON-compatible dictionary.
__repr__():
Returns a string representation of the multiband amplifier instance.
__str__():
Returns a formatted string representation of the multiband amplifier and its amplifiers.
Raises:
-------
ParametersError: If there are conflicting amplifier definitions for the same frequency band during initialization.
ValueError: If the input spectral information does not match any defined amplifier bands during propagation.
"""
# separate the top level type_variety from kwargs to avoid having multiple type_varieties on each element processing
def __init__(self, *args, amplifiers: List[dict], params: dict, **kwargs):
self.variety_list = kwargs.pop('variety_list', None)
try:
super().__init__(params=MultiBandParams(**params), **kwargs)
except ParametersError as e:
raise ParametersError(f'{kwargs["uid"]}: {e}') from e
self.amplifiers = {}
if 'type_variety' in kwargs:
kwargs.pop('type_variety')
self.passive = False
for amp_dict in amplifiers:
# amplifiers dict uses default names as key to represent the band
amp = Edfa(**amp_dict, **kwargs)
band = next(b for b in amp.params.bands)
band_name = find_band_name(FrequencyBand(f_min=band["f_min"], f_max=band["f_max"]))
if band_name not in self.amplifiers.keys() and band not in self.params.bands:
self.params.bands.append(band)
self.amplifiers[band_name] = amp
elif band_name not in self.amplifiers.keys() and band in self.params.bands:
self.amplifiers[band_name] = amp
else:
raise ParametersError(f'{kwargs["uid"]}: has more than one amp defined for the same band')
def __call__(self, spectral_info: SpectralInformation):
"""propagates in each amp and returns the muxed spectrum
"""
out_si = []
for _, amp in self.amplifiers.items():
si = demuxed_spectral_information(spectral_info, amp.params.bands[0])
# if spectral_info frequencies are outside amp band, si is None
if si:
si = amp(si)
out_si.append(si)
if not out_si:
raise ValueError('Defined propagation band does not match amplifiers band.')
return muxed_spectral_information(out_si)
@property
def to_json(self):
return {'uid': self.uid,
'type': type(self).__name__,
'type_variety': self.type_variety,
'amplifiers': [{
'type_variety': amp.type_variety,
'operational': {
'gain_target': round(amp.effective_gain, 6),
'delta_p': amp.delta_p,
'tilt_target': amp.tilt_target,
'out_voa': amp.out_voa
}} for amp in self.amplifiers.values()
],
'metadata': {
'location': self.metadata['location']._asdict()
}
}
def __repr__(self):
return (f'{type(self).__name__}(uid={self.uid!r}, '
f'type_variety={self.type_variety!r}, ')
def __str__(self):
amp_str = [f'{type(self).__name__} {self.uid}',
f' type_variety: {self.type_variety}']
multi_str_data = []
max_width = 0
for amp in self.amplifiers.values():
lines = amp.__str__().split('\n')
# start at index 1 to remove uid from each amp list of strings
# records only if amp is used ie si has frequencies in amp) otherwise there is no other string than the uid
if len(lines) > 1:
max_width = max(max_width, max([len(line) for line in lines[1:]]))
multi_str_data.append(lines[1:])
# multi_str_data contains lines with each amp str, instead we want to print per column: transpose the string
transposed_data = list(map(list, zip(*multi_str_data)))
return '\n'.join(amp_str) + '\n' + nice_column_str(data=transposed_data, max_length=max_width + 2, padding=3)

View File

@@ -7,35 +7,43 @@ gnpy.core.equipment
This module contains functionality for specifying equipment.
"""
from collections import defaultdict
from functools import reduce
from typing import List
from gnpy.core.utils import automatic_nch, db2lin
from gnpy.core.exceptions import EquipmentConfigError
from gnpy.core.exceptions import EquipmentConfigError, ConfigurationError
def trx_mode_params(equipment, trx_type_variety='', trx_mode='', error_message=False):
"""return the trx and SI parameters from eqpt_config for a given type_variety and mode (ie format)"""
"""return the trx and SI parameters from eqpt_config for a given type_variety and mode (ie format)
if the type or mode do no match an existing transceiver in the library, then the function
raises an error if error_message is True else returns a default mode based on equipment['SI']['default']
If trx_mode is None (but type is valid), it returns an undetermined mode whatever the error message:
this is a special case for automatic mode selection.
"""
trx_params = {}
default_si_data = equipment['SI']['default']
try:
trxs = equipment['Transceiver']
# if called from path_requests_run.py, trx_mode is filled with None when not specified by user
# if called from transmission_main.py, trx_mode is ''
if trx_mode is not None:
mode_params = next(mode for trx in trxs
if trx == trx_type_variety
for mode in trxs[trx].mode
if mode['format'] == trx_mode)
trx_params = {**mode_params}
# sanity check: spacing baudrate must be smaller than min spacing
if trx_params['baud_rate'] > trx_params['min_spacing']:
raise EquipmentConfigError(f'Inconsistency in equipment library:\n Transponder "{trx_type_variety}"'
+ f' mode "{trx_params["format"]}" has baud rate'
+ f' {trx_params["baud_rate"] * 1e-9:.3f} GHz greater than min_spacing'
+ f' {trx_params["min_spacing"] * 1e-9:.3f}.')
trx_params['equalization_offset_db'] = trx_params.get('equalization_offset_db', 0)
else:
mode_params = {"format": "undetermined",
# default transponder characteristics
# mainly used with transmission_main_example.py
default_trx_params = {
'f_min': default_si_data.f_min,
'f_max': default_si_data.f_max,
'baud_rate': default_si_data.baud_rate,
'spacing': default_si_data.spacing,
'OSNR': None,
'penalties': {},
'bit_rate': None,
'cost': None,
'roll_off': default_si_data.roll_off,
'tx_osnr': default_si_data.tx_osnr,
'min_spacing': None,
'equalization_offset_db': 0
}
# Undetermined transponder characteristics
# mainly used with path_request_run.py for the automatic mode computation case
undetermined_trx_params = {
"format": "undetermined",
"baud_rate": None,
"OSNR": None,
"penalties": None,
@@ -44,34 +52,81 @@ def trx_mode_params(equipment, trx_type_variety='', trx_mode='', error_message=F
"tx_osnr": None,
"min_spacing": None,
"cost": None,
"equalization_offset_db": 0}
trx_params = {**mode_params}
trx_params['f_min'] = equipment['Transceiver'][trx_type_variety].frequency['min']
trx_params['f_max'] = equipment['Transceiver'][trx_type_variety].frequency['max']
# TODO: novel automatic feature maybe unwanted if spacing is specified
# trx_params['spacing'] = _automatic_spacing(trx_params['baud_rate'])
# temp = trx_params['spacing']
# print(f'spacing {temp}')
except StopIteration:
if error_message:
raise EquipmentConfigError(f'Could not find transponder "{trx_type_variety}" with mode "{trx_mode}" in equipment library')
else:
# default transponder charcteristics
# mainly used with transmission_main_example.py
trx_params['f_min'] = default_si_data.f_min
trx_params['f_max'] = default_si_data.f_max
trx_params['baud_rate'] = default_si_data.baud_rate
trx_params['spacing'] = default_si_data.spacing
trx_params['OSNR'] = None
trx_params['penalties'] = {}
trx_params['bit_rate'] = None
trx_params['cost'] = None
trx_params['roll_off'] = default_si_data.roll_off
trx_params['tx_osnr'] = default_si_data.tx_osnr
trx_params['min_spacing'] = None
trx_params['equalization_offset_db'] = 0
trx_params['power'] = db2lin(default_si_data.power_dbm) * 1e-3
"equalization_offset_db": 0
}
trxs = equipment['Transceiver']
if trx_type_variety in trxs:
modes = {mode['format']: mode for mode in trxs[trx_type_variety].mode}
trx_frequencies = {'f_min': trxs[trx_type_variety].frequency['min'],
'f_max': trxs[trx_type_variety].frequency['max']}
if trx_mode in modes:
# if called from transmission_main.py, trx_mode is ''
trx_params = {**modes[trx_mode], **trx_frequencies}
if trx_params['baud_rate'] > trx_params['min_spacing']:
# sanity check: baudrate must be smaller than min spacing
raise EquipmentConfigError(f'Inconsistency in equipment library:\n Transponder "{trx_type_variety}" '
+ f'mode "{trx_params["format"]}" has baud rate '
+ f'{trx_params["baud_rate"] * 1e-9:.2f} GHz greater than min_spacing '
+ f'{trx_params["min_spacing"] * 1e-9:.2f}.')
trx_params['equalization_offset_db'] = trx_params.get('equalization_offset_db', 0)
return trx_params
if trx_mode is None:
# if called from path_requests_run.py, trx_mode is filled with None when not specified by user
trx_params = {**undetermined_trx_params, **trx_frequencies}
return trx_params
if trx_type_variety in trxs and error_message:
raise EquipmentConfigError(f'Could not find transponder "{trx_type_variety}" with mode "{trx_mode}" '
+ 'in equipment library')
if error_message:
raise EquipmentConfigError(f'Could not find transponder "{trx_type_variety}" in equipment library')
trx_params = {**default_trx_params}
return trx_params
def find_type_variety(amps: List[str], equipment: dict) -> List[str]:
"""Returns the multiband type_variety associated with a list of single band type_varieties
Args:
amps (List[str]): A list of single band type_varieties.
equipment (dict): A dictionary containing equipment information.
Returns:
str: an amplifier type variety
"""
listes = find_type_varieties(amps, equipment)
_found_type = list(reduce(lambda x, y: set(x) & set(y), listes))
# Given a list of single band amplifiers, find the multiband amplifier whose multi_band group
# matches. For example, if amps list contains ["a1_LBAND", "a2_CBAND"], with a1.multi_band = [a1_LBAND, a1_CBAND]
# and a2.multi_band = [a1_LBAND, a2_CBAND], then:
# possible_type_varieties = {"a1_LBAND": ["a1", "a2"], "a2_CBAND": ["a2"]}
# listes = [["a1", "a2"], ["a2"]]
# and _found_type = [a2]
if not _found_type:
msg = f'{amps} amps do not belong to the same amp type {listes}'
raise ConfigurationError(msg)
return _found_type
def find_type_varieties(amps: List[str], equipment: dict) -> List[List[str]]:
"""Returns the multiband list of type_varieties associated with a list of single band type_varieties
Args:
amps (List[str]): A list of single band type_varieties.
equipment (dict): A dictionary containing equipment information.
Returns:
List[List[str]]: A list of lists containing the multiband type_varieties
associated with each single band type_variety.
"""
possible_type_varieties = defaultdict(list)
for amp_name, amp in equipment['Edfa'].items():
if amp.multi_band is not None:
for elem in amp.multi_band:
# possible_type_varieties stores the list of multiband amp names that list this elem as
# a possible amplifier of the multiband group. For example, if "std_medium_gain_multiband"
# and "std_medium_gain_multiband_new" contain "std_medium_gain_C" in their "multi_band" list, then:
# possible_type_varieties["std_medium_gain_C"] =
# ["std_medium_gain_multiband", "std_medium_gain_multiband_new"]
possible_type_varieties[elem].append(amp_name)
return [possible_type_varieties[a] for a in amps]

View File

@@ -11,7 +11,7 @@ This module contains classes for modelling :class:`SpectralInformation`.
from __future__ import annotations
from collections import namedtuple
from collections.abc import Iterable
from typing import Union
from typing import Union, List, Optional
from dataclasses import dataclass
from numpy import argsort, mean, array, append, ones, ceil, any, zeros, outer, full, ndarray, asarray
@@ -52,7 +52,7 @@ class SpectralInformation(object):
def __init__(self, frequency: array, baud_rate: array, slot_width: array, signal: array, nli: array, ase: array,
roll_off: array, chromatic_dispersion: array, pmd: array, pdl: array, latency: array,
delta_pdb_per_channel: array, tx_osnr: array, label: array):
delta_pdb_per_channel: array, tx_osnr: array, tx_power: array, label: array):
indices = argsort(frequency)
self._frequency = frequency[indices]
self._df = outer(ones(frequency.shape), frequency) - outer(frequency, ones(frequency.shape))
@@ -80,6 +80,7 @@ class SpectralInformation(object):
self._latency = latency[indices]
self._delta_pdb_per_channel = delta_pdb_per_channel[indices]
self._tx_osnr = tx_osnr[indices]
self._tx_power = tx_power[indices]
self._label = label[indices]
@property
@@ -188,6 +189,14 @@ class SpectralInformation(object):
def tx_osnr(self, tx_osnr):
self._tx_osnr = tx_osnr
@property
def tx_power(self):
return self._tx_power
@tx_power.setter
def tx_power(self, tx_power):
self._tx_power = tx_power
@property
def channel_number(self):
return self._channel_number
@@ -232,6 +241,7 @@ class SpectralInformation(object):
delta_pdb_per_channel=append(self.delta_pdb_per_channel,
other.delta_pdb_per_channel),
tx_osnr=append(self.tx_osnr, other.tx_osnr),
tx_power=append(self.tx_power, other.tx_power),
label=append(self.label, other.label))
except SpectrumError:
raise SpectrumError('Spectra cannot be summed: channels overlapping.')
@@ -251,6 +261,7 @@ def create_arbitrary_spectral_information(frequency: Union[ndarray, Iterable, fl
signal: Union[float, ndarray, Iterable],
baud_rate: Union[float, ndarray, Iterable],
tx_osnr: Union[float, ndarray, Iterable],
tx_power: Union[float, ndarray, Iterable] = None,
delta_pdb_per_channel: Union[float, ndarray, Iterable] = 0.,
slot_width: Union[float, ndarray, Iterable] = None,
roll_off: Union[float, ndarray, Iterable] = 0.,
@@ -277,6 +288,7 @@ def create_arbitrary_spectral_information(frequency: Union[ndarray, Iterable, fl
ase = zeros(number_of_channels)
delta_pdb_per_channel = full(number_of_channels, delta_pdb_per_channel)
tx_osnr = full(number_of_channels, tx_osnr)
tx_power = full(number_of_channels, tx_power)
label = full(number_of_channels, label)
return SpectralInformation(frequency=frequency, slot_width=slot_width,
signal=signal, nli=nli, ase=ase,
@@ -284,7 +296,7 @@ def create_arbitrary_spectral_information(frequency: Union[ndarray, Iterable, fl
chromatic_dispersion=chromatic_dispersion,
pmd=pmd, pdl=pdl, latency=latency,
delta_pdb_per_channel=delta_pdb_per_channel,
tx_osnr=tx_osnr, label=label)
tx_osnr=tx_osnr, tx_power=tx_power, label=label)
except ValueError as e:
if 'could not broadcast' in str(e):
raise SpectrumError('Dimension mismatch in input fields.')
@@ -292,45 +304,96 @@ def create_arbitrary_spectral_information(frequency: Union[ndarray, Iterable, fl
raise
def create_input_spectral_information(f_min, f_max, roll_off, baud_rate, power, spacing, tx_osnr, delta_pdb=0):
def create_input_spectral_information(f_min, f_max, roll_off, baud_rate, spacing, tx_osnr, tx_power,
delta_pdb=0):
"""Creates a fixed slot width spectral information with flat power.
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)]
delta_pdb_per_channel = delta_pdb * ones(number_of_channels)
label = [f'{baud_rate * 1e-9 :.2f}G' for i in range(number_of_channels)]
return create_arbitrary_spectral_information(frequency, slot_width=spacing, signal=power, baud_rate=baud_rate,
return create_arbitrary_spectral_information(frequency, slot_width=spacing, signal=tx_power, baud_rate=baud_rate,
roll_off=roll_off, delta_pdb_per_channel=delta_pdb_per_channel,
tx_osnr=tx_osnr, label=label)
tx_osnr=tx_osnr, tx_power=tx_power, label=label)
def is_in_band(frequency: float, band: dict) -> bool:
"""band has {"f_min": value, "f_max": value} format
"""
if frequency >= band['f_min'] and frequency <= band['f_max']:
return True
return False
def demuxed_spectral_information(input_si: SpectralInformation, band: dict) -> Optional[SpectralInformation]:
"""extract a si based on band
"""
filtered_indices = [i for i, f in enumerate(input_si.frequency)
if is_in_band(f - input_si.slot_width[i] / 2, band)
and is_in_band(f + input_si.slot_width[i] / 2, band)]
if filtered_indices:
frequency = input_si.frequency[filtered_indices]
baud_rate = input_si.baud_rate[filtered_indices]
slot_width = input_si.slot_width[filtered_indices]
signal = input_si.signal[filtered_indices]
nli = input_si.nli[filtered_indices]
ase = input_si.ase[filtered_indices]
roll_off = input_si.roll_off[filtered_indices]
chromatic_dispersion = input_si.chromatic_dispersion[filtered_indices]
pmd = input_si.pmd[filtered_indices]
pdl = input_si.pdl[filtered_indices]
latency = input_si.latency[filtered_indices]
delta_pdb_per_channel = input_si.delta_pdb_per_channel[filtered_indices]
tx_osnr = input_si.tx_osnr[filtered_indices]
tx_power = input_si.tx_power[filtered_indices]
label = input_si.label[filtered_indices]
return SpectralInformation(frequency=frequency, baud_rate=baud_rate, slot_width=slot_width, signal=signal,
nli=nli, ase=ase, roll_off=roll_off, chromatic_dispersion=chromatic_dispersion,
pmd=pmd, pdl=pdl, latency=latency, delta_pdb_per_channel=delta_pdb_per_channel,
tx_osnr=tx_osnr, tx_power=tx_power, label=label)
return None
def muxed_spectral_information(input_si_list: List[SpectralInformation]) -> SpectralInformation:
"""return the assembled spectrum
"""
if input_si_list and len(input_si_list) > 1:
si = input_si_list[0] + muxed_spectral_information(input_si_list[1:])
return si
elif input_si_list and len(input_si_list) == 1:
return input_si_list[0]
else:
raise ValueError('liste vide')
def carriers_to_spectral_information(initial_spectrum: dict[float, Carrier],
power: float) -> 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.
tx_osnr, tx_power and roll off.
:param power: power of the request
"""
frequency = list(initial_spectrum.keys())
signal = [power * db2lin(c.delta_pdb) for c in initial_spectrum.values()]
signal = [c.tx_power for c in initial_spectrum.values()]
roll_off = [c.roll_off for c in initial_spectrum.values()]
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()]
tx_power = [c.tx_power for c in initial_spectrum.values()]
label = [c.label for c in initial_spectrum.values()]
p_span0 = watt2dbm(power)
return create_arbitrary_spectral_information(frequency=frequency, signal=signal, baud_rate=baud_rate,
slot_width=slot_width, roll_off=roll_off,
delta_pdb_per_channel=delta_pdb_per_channel, tx_osnr=tx_osnr,
label=label)
tx_power=tx_power, 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.
tx_power, and tx_osnr. delta_pdb offset is applied to target power out of Roadm.
Label is used to group carriers which belong to the same partition when printing results.
"""
delta_pdb: float
@@ -338,6 +401,7 @@ class Carrier:
slot_width: float
roll_off: float
tx_osnr: float
tx_power: float
label: str
@@ -347,7 +411,7 @@ class ReferenceCarrier:
constant power spectral density (PSD) equalization is set. Reference channel is the type that has been defined
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.
experienced by reference channel 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
@@ -358,7 +422,7 @@ class ReferenceCarrier:
For example, if target PSW is 2e4mW/GHz and reference carrier type a 32 GBaud channel in a 50GHz slot width then
output power should be -20 dBm and for a 64 GBaud channel in a 75 GHz slot width, power target would be -18.24 dBm.
Other attributes (like slot_width or roll-off) may be added there for future equalization purpose.
Other attributes (like roll-off) may be added there for future equalization purpose.
"""
baud_rate: float
slot_width: float

File diff suppressed because it is too large Load Diff

View File

@@ -8,7 +8,8 @@ gnpy.core.parameters
This module contains all parameters to configure standard network elements.
"""
from collections import namedtuple
from copy import deepcopy
from dataclasses import dataclass
from scipy.constants import c, pi
from numpy import asarray, array, exp, sqrt, log, outer, ones, squeeze, append, flip, linspace, full
@@ -35,32 +36,54 @@ class PumpParams(Parameters):
class RamanParams(Parameters):
def __init__(self, flag=False, result_spatial_resolution=10e3, solver_spatial_resolution=50):
def __init__(self, flag=False, method='perturbative', order=2, result_spatial_resolution=10e3,
solver_spatial_resolution=10e3):
"""Simulation parameters used within the Raman Solver
:params flag: boolean for enabling/disable the evaluation of the Raman power profile in frequency and position
:params method: Raman solver method
:params order: solution order for perturbative method
:params result_spatial_resolution: spatial resolution of the evaluated Raman power profile
:params solver_spatial_resolution: spatial step for the iterative solution of the first order ode
"""
self.flag = flag
self.method = method
self.order = order
self.result_spatial_resolution = result_spatial_resolution # [m]
self.solver_spatial_resolution = solver_spatial_resolution # [m]
def to_json(self):
return {"flag": self.flag,
"method": self.method,
"order": self.order,
"result_spatial_resolution": self.result_spatial_resolution,
"solver_spatial_resolution": self.solver_spatial_resolution}
class NLIParams(Parameters):
def __init__(self, method='gn_model_analytic', dispersion_tolerance=1, phase_shift_tolerance=0.1,
computed_channels=None):
def __init__(self, method='gn_model_analytic', dispersion_tolerance=4, phase_shift_tolerance=0.1,
computed_channels=None, computed_number_of_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
:params computed_number_of_channels: the NLI is evaluated for this number of channels equally distributed
in the spectrum and extrapolated for the others
"""
self.method = method.lower()
self.dispersion_tolerance = dispersion_tolerance
self.phase_shift_tolerance = phase_shift_tolerance
self.computed_channels = computed_channels
self.computed_number_of_channels = computed_number_of_channels
def to_json(self):
return {"method": self.method,
"dispersion_tolerance": self.dispersion_tolerance,
"phase_shift_tolerance": self.phase_shift_tolerance,
"computed_channels": self.computed_channels,
"computed_number_of_channels": self.computed_number_of_channels}
class SimParams(Parameters):
@@ -98,8 +121,68 @@ class RoadmParams(Parameters):
self.pmd = kwargs['pmd']
self.pdl = kwargs['pdl']
self.restrictions = kwargs['restrictions']
self.roadm_path_impairments = self.get_roadm_path_impairments(kwargs['roadm-path-impairments'])
except KeyError as e:
raise ParametersError(f'ROADM configurations must include {e}. Configuration: {kwargs}')
self.per_degree_impairments = kwargs.get('per_degree_impairments', [])
self.design_bands = kwargs.get('design_bands', [])
self.per_degree_design_bands = kwargs.get('per_degree_design_bands', {})
def get_roadm_path_impairments(self, path_impairments_list):
"""Get the ROADM list of profiles for impairments definition
transform the ietf model into gnpy internal model: add a path-type in the attributes
"""
if not path_impairments_list:
return {}
authorized_path_types = {
'roadm-express-path': 'express',
'roadm-add-path': 'add',
'roadm-drop-path': 'drop',
}
roadm_path_impairments = {}
for path_impairment in path_impairments_list:
index = path_impairment['roadm-path-impairments-id']
path_type = next(key for key in path_impairment if key in authorized_path_types.keys())
impairment_dict = {'path-type': authorized_path_types[path_type], 'impairment': path_impairment[path_type]}
roadm_path_impairments[index] = RoadmImpairment(impairment_dict)
return roadm_path_impairments
class RoadmPath:
def __init__(self, from_degree, to_degree, path_type, impairment_id=None, impairment=None):
"""Records roadm internal paths, types and impairment
path_type must be in "express", "add", "drop"
impairment_id must be one of the id detailed in equipement
"""
self.from_degree = from_degree
self.to_degree = to_degree
self.path_type = path_type
self.impairment_id = impairment_id
self.impairment = impairment
class RoadmImpairment:
"""Generic definition of impairments for express, add and drop"""
default_values = {
'roadm-pmd': None,
'roadm-cd': None,
'roadm-pdl': None,
'roadm-inband-crosstalk': None,
'roadm-maxloss': 0,
'roadm-osnr': None,
'roadm-pmax': None,
'roadm-noise-figure': None,
'minloss': None,
'typloss': None,
'pmin': None,
'ptyp': None
}
def __init__(self, params):
self.path_type = params.get('path-type')
self.impairments = params['impairment']
class FusedParams(Parameters):
@@ -108,7 +191,33 @@ class FusedParams(Parameters):
DEFAULT_RAMAN_COEFFICIENT = {
# SSMF Raman coefficient profile normalized with respect to the effective area overlap (g0 * A_eff(f_probe, f_pump))
# SSMF Raman coefficient profile in terms of mode intensity (g0 * A_ff_overlap)
'gamma_raman': array(
[0.0, 8.524419934705497e-16, 2.643567866245371e-15, 4.410548410941305e-15, 6.153422961291078e-15,
7.484924703044943e-15, 8.452060808349209e-15, 9.101549322698156e-15, 9.57837595158966e-15,
1.0008642675474562e-14, 1.0865773569905647e-14, 1.1300776305865833e-14, 1.2143238647099625e-14,
1.3231065750676068e-14, 1.4624900971525384e-14, 1.6013330554840492e-14, 1.7458119359310242e-14,
1.9320241330434762e-14, 2.1720395392873534e-14, 2.4137337406734775e-14, 2.628163218460466e-14,
2.8041019963285974e-14, 2.9723155447089933e-14, 3.129353531005888e-14, 3.251796163324624e-14,
3.3198839487612773e-14, 3.329527690685666e-14, 3.313155691238456e-14, 3.289013852154548e-14,
3.2458917188506916e-14, 3.060684277937575e-14, 3.2660349473783173e-14, 2.957419109657689e-14,
2.518894321396672e-14, 1.734560485857344e-14, 9.902860761605233e-15, 7.219176385099358e-15,
6.079565990401311e-15, 5.828373065963427e-15, 7.20580801091692e-15, 7.561924351387493e-15,
7.621152352332206e-15, 6.8859886780643254e-15, 5.629181047471162e-15, 3.679727598966185e-15,
2.7555869742500355e-15, 2.4810133942597675e-15, 2.2160080532403624e-15, 2.1440626024765557e-15,
2.33873070799544e-15, 2.557317929858713e-15, 3.039839048226572e-15, 4.8337165515610065e-15,
5.4647431818257436e-15, 5.229187813711269e-15, 4.510768525811313e-15, 3.3213473130607794e-15,
2.2602577027996455e-15, 1.969576495866441e-15, 1.5179853954188527e-15, 1.2953988551200156e-15,
1.1304672156251838e-15, 9.10004390675213e-16, 8.432919922183503e-16, 7.849224069008326e-16,
7.827568196032024e-16, 9.000514440646232e-16, 1.3025926460013665e-15, 1.5444108938497558e-15,
1.8795594063060786e-15, 1.7796130169921014e-15, 1.5938159865046653e-15, 1.1585522355108287e-15,
8.507044444633358e-16, 7.625404663756823e-16, 8.14510750925789e-16, 9.047944693473188e-16,
9.636431901702084e-16, 9.298633899602105e-16, 8.349739503637023e-16, 7.482901278066085e-16,
6.240794767134268e-16, 5.00652535687506e-16, 3.553373263685851e-16, 2.0344217706119682e-16,
1.4267522642294203e-16, 8.980016576743517e-17, 2.9829068181832594e-17, 1.4861959129014824e-17,
7.404482113326137e-18]
), # m/W
# SSMF Raman coefficient profile
'g0': array(
[0.00000000e+00, 1.12351610e-05, 3.47838074e-05, 5.79356636e-05, 8.06921680e-05, 9.79845709e-05, 1.10454361e-04,
1.18735302e-04, 1.24736889e-04, 1.30110053e-04, 1.41001273e-04, 1.46383247e-04, 1.57011792e-04, 1.70765865e-04,
@@ -123,22 +232,21 @@ DEFAULT_RAMAN_COEFFICIENT = {
2.03744008e-05, 1.81939341e-05, 1.31862121e-05, 9.65352116e-06, 8.62698322e-06, 9.18688016e-06, 1.01737784e-05,
1.08017817e-05, 1.03903588e-05, 9.30040333e-06, 8.30809173e-06, 6.90650401e-06, 5.52238029e-06, 3.90648708e-06,
2.22908227e-06, 1.55796177e-06, 9.77218716e-07, 3.23477236e-07, 1.60602454e-07, 7.97306386e-08]
), # [m/W]
), # [1 / (W m)]
# Note the non-uniform spacing of this range; this is required for properly capturing the Raman peak shape.
'frequency_offset': array([
0., 0.5, 1., 1.5, 2., 2.5, 3., 3.5, 4., 4.5, 5., 5.5, 6., 6.5, 7., 7.5, 8., 8.5, 9., 9.5, 10., 10.5, 11., 11.5,
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, # [Hz]
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, # [Hz]
# Raman profile reference frequency
'reference_frequency': 206184634112792 # [Hz] (1454 nm)}
'reference_frequency': 206.184634112792e12, # [Hz] (1454 nm)
# Raman profile reference effective area
'reference_effective_area': 75.74659443542413e-12 # [m^2] (@1454 nm)
}
@@ -211,14 +319,21 @@ class FiberParams(Parameters):
pi * self._core_radius ** 2 / self._effective_area)) ** 2
# Raman Gain Coefficient
raman_coefficient = kwargs.get('raman_coefficient', DEFAULT_RAMAN_COEFFICIENT)
self._g0 = asarray(raman_coefficient['g0'])
raman_reference_frequency = raman_coefficient['reference_frequency']
raman_coefficient = kwargs.get('raman_coefficient')
if raman_coefficient is None:
self._raman_reference_frequency = DEFAULT_RAMAN_COEFFICIENT['reference_frequency']
frequency_offset = asarray(DEFAULT_RAMAN_COEFFICIENT['frequency_offset'])
gamma_raman = asarray(DEFAULT_RAMAN_COEFFICIENT['gamma_raman'])
stokes_wave = self._raman_reference_frequency - frequency_offset
normalized_gamma_raman = gamma_raman / self._raman_reference_frequency # 1 / m / W / Hz
self._g0 = gamma_raman / self.effective_area_overlap(stokes_wave, self._raman_reference_frequency)
else:
self._raman_reference_frequency = raman_coefficient['reference_frequency']
frequency_offset = asarray(raman_coefficient['frequency_offset'])
stokes_wave = raman_reference_frequency - frequency_offset
gamma_raman = self._g0 * self.effective_area_overlap(stokes_wave, raman_reference_frequency)
normalized_gamma_raman = gamma_raman / raman_reference_frequency # 1 / m / W / Hz
self._raman_reference_frequency = raman_reference_frequency
stokes_wave = self._raman_reference_frequency - frequency_offset
self._g0 = asarray(raman_coefficient['g0'])
gamma_raman = self._g0 * self.effective_area_overlap(stokes_wave, self._raman_reference_frequency)
normalized_gamma_raman = gamma_raman / self._raman_reference_frequency # 1 / m / W / Hz
# Raman gain coefficient array of the frequency offset constructed such that positive frequency values
# represent a positive power transfer from higher frequency and vice versa
@@ -355,6 +470,38 @@ class FiberParams(Parameters):
class EdfaParams:
default_values = {
'f_min': None,
'f_max': None,
'multi_band': None,
'bands': None,
'type_variety': '',
'type_def': '',
'gain_flatmax': None,
'gain_min': None,
'p_max': None,
'nf_model': None,
'dual_stage_model': None,
'preamp_variety': None,
'booster_variety': None,
'nf_min': None,
'nf_max': None,
'nf_coef': None,
'nf0': None,
'nf_fit_coeff': None,
'nf_ripple': 0,
'dgt': None,
'gain_ripple': 0,
'tilt_ripple': 0,
'f_ripple_ref': None,
'out_voa_auto': False,
'allowed_for_design': False,
'raman': False,
'pmd': 0,
'pdl': 0,
'advance_configurations_from_json': None
}
def __init__(self, **params):
try:
self.type_variety = params['type_variety']
@@ -363,9 +510,11 @@ class EdfaParams:
# Bandwidth
self.f_min = params['f_min']
self.f_max = params['f_max']
self.bandwidth = self.f_max - self.f_min
self.f_cent = (self.f_max + self.f_min) / 2
self.bandwidth = self.f_max - self.f_min if self.f_max and self.f_min else None
self.f_cent = (self.f_max + self.f_min) / 2 if self.f_max and self.f_min else None
self.f_ripple_ref = params['f_ripple_ref']
self.bands = [{'f_min': params['f_min'],
'f_max': params['f_max']}]
# Gain
self.gain_flatmax = params['gain_flatmax']
@@ -413,7 +562,9 @@ class EdfaParams:
else:
self.nf_ripple = asarray(nf_ripple)
if self.nf_ripple.size != self.gain_ripple.size:
raise ParametersError("The noise figure ripple and the gain ripple must have the same size.")
raise ParametersError(
"The noise figure ripple and the gain ripple must have the same size. %s, %s",
self.nf_ripple.size, self.gain_ripple.size)
# VOA
self.out_voa_auto = params['out_voa_auto']
@@ -452,7 +603,7 @@ class EdfaParams:
def update_params(self, kwargs):
for k, v in kwargs.items():
setattr(self, k, self.update_params(**v) if isinstance(v, dict) else v)
setattr(self, k, v)
class EdfaOperational:
@@ -460,7 +611,7 @@ class EdfaOperational:
'gain_target': None,
'delta_p': None,
'out_voa': None,
'tilt_target': 0
'tilt_target': None
}
def __init__(self, **operational):
@@ -475,3 +626,95 @@ class EdfaOperational:
return (f'{type(self).__name__}('
f'gain_target={self.gain_target!r}, '
f'tilt_target={self.tilt_target!r})')
DEFAULT_EDFA_CONFIG = {
"nf_ripple": [
0.0
],
"gain_ripple": [
0.0
],
"f_min": 191.275e12,
"f_max": 196.125e12,
"dgt": [
1.0, 1.017807767853702, 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
]
}
class MultiBandParams:
default_values = {
'bands': [],
'type_variety': '',
'type_def': None,
'allowed_for_design': False
}
def __init__(self, **params):
try:
self.update_attr(params)
except KeyError as e:
raise ParametersError(f'Multiband configurations json must include {e}. Configuration: {params}')
def update_attr(self, kwargs):
clean_kwargs = {k: v for k, v in kwargs.items() if v != ''}
for k, v in self.default_values.items():
# use deepcopy to avoid sharing same object amongst all instance when v is a list or a dict!
if isinstance(v, (list, dict)):
setattr(self, k, clean_kwargs.get(k, deepcopy(v)))
else:
setattr(self, k, clean_kwargs.get(k, v))
class TransceiverParams:
def __init__(self, **params):
self.design_bands = params.get('design_bands', [])
self.per_degree_design_bands = params.get('per_degree_design_bands', {})
@dataclass
class FrequencyBand:
"""Frequency band
"""
f_min: float
f_max: float
DEFAULT_BANDS_DEFINITION = {
"LBAND": FrequencyBand(f_min=187e12, f_max=189e12),
"CBAND": FrequencyBand(f_min=191.3e12, f_max=196.0e12)
}
# use this definition to index amplifiers'element of a multiband amplifier.
# this is not the design band
def find_band_name(band: FrequencyBand) -> str:
"""return the default band name (CBAND, LBAND, ...) that corresponds to the band frequency range
Use the band center frequency: if center frequency is inside the band then returns CBAND.
This is to flexibly encompass all kind of bands definitions.
returns the first matching band name.
"""
for band_name, frequency_range in DEFAULT_BANDS_DEFINITION.items():
center_frequency = (band.f_min + band.f_max) / 2
if center_frequency >= frequency_range.f_min and center_frequency <= frequency_range.f_max:
return band_name
return 'unknown_band'

View File

@@ -12,14 +12,14 @@ The solvers take as input instances of the spectral information, the fiber and t
from numpy import interp, pi, zeros, cos, array, append, ones, exp, arange, sqrt, trapz, arcsinh, clip, abs, sum, \
concatenate, flip, outer, inner, transpose, max, format_float_scientific, diag, sort, unique, argsort, cumprod, \
polyfit
polyfit, log, reshape, swapaxes, full, nan, cumsum
from logging import getLogger
from scipy.constants import k, h
from scipy.interpolate import interp1d
from math import isclose
from math import isclose, factorial
from gnpy.core.utils import db2lin, lin2db
from gnpy.core.exceptions import EquipmentConfigError
from gnpy.core.exceptions import EquipmentConfigError, ParametersError
from gnpy.core.parameters import SimParams
from gnpy.core.info import SpectralInformation
@@ -136,15 +136,17 @@ class RamanSolver:
co_cr = fiber.cr(co_frequency)
co_alpha = fiber.alpha(co_frequency)
co_power_profile = \
RamanSolver.first_order_derivative_solution(co_power, co_alpha, co_cr, z, lumped_losses)
RamanSolver.calculate_unidirectional_stimulated_raman_scattering(co_power, co_alpha, co_cr, z,
lumped_losses)
# Counter-propagating profile initialization
cnt_power_profile = zeros([cnt_frequency.size, z.size])
if cnt_frequency.size:
cnt_cr = fiber.cr(cnt_frequency)
cnt_alpha = fiber.alpha(cnt_frequency)
cnt_power_profile = \
flip(RamanSolver.first_order_derivative_solution(cnt_power, cnt_alpha, cnt_cr,
z[-1] - flip(z), flip(lumped_losses)), axis=1)
cnt_power_profile = flip(
RamanSolver.calculate_unidirectional_stimulated_raman_scattering(cnt_power, cnt_alpha, cnt_cr,
z[-1] - flip(z),
flip(lumped_losses)), axis=1)
# Co-propagating and Counter-propagating Profile Computation
if co_frequency.size and cnt_frequency.size:
co_power_profile, cnt_power_profile = \
@@ -163,8 +165,9 @@ class RamanSolver:
alpha = fiber.alpha(spectral_info.frequency)
cr = fiber.cr(spectral_info.frequency)
# Power profile
power_profile = \
RamanSolver.first_order_derivative_solution(spectral_info.signal, alpha, cr, z, lumped_losses)
power_profile = (
RamanSolver.calculate_unidirectional_stimulated_raman_scattering(spectral_info.signal, alpha, cr, z,
lumped_losses))
# Loss profile
loss_profile = power_profile / outer(spectral_info.signal, ones(z.size))
frequency = spectral_info.frequency
@@ -200,8 +203,8 @@ class RamanSolver:
return ase
@staticmethod
def first_order_derivative_solution(power_in, alpha, cr, z, lumped_losses):
"""Solves the Raman first order derivative equation
def calculate_unidirectional_stimulated_raman_scattering(power_in, alpha, cr, z, lumped_losses):
"""Solves the Raman equation
:param power_in: launch power array
:param alpha: loss coefficient array
@@ -210,18 +213,66 @@ class RamanSolver:
:param lumped_losses: concentrated losses array along the fiber span
:return: power profile matrix
"""
if sim_params.raman_params.method == 'perturbative':
if sim_params.raman_params.order > 4:
raise ValueError(f'Order {sim_params.raman_params.order} not implemented in Raman Solver.')
z_lumped_losses = append(z[lumped_losses != 1], z[-1])
llumped_losses = append(1, lumped_losses[lumped_losses != 1])
power = outer(power_in, ones(z.size))
last_position = 0
z_indices = arange(0, z.size)
for z_lumped_loss, lumped_loss in zip(z_lumped_losses, llumped_losses):
if last_position < z[-1]:
interval = z_indices[(z >= last_position) * (z <= z_lumped_loss) == 1]
z_interval = z[interval] - last_position
dz = z_interval[1:] - z_interval[:-1]
last_position = z[interval][-1]
p0 = power_in * lumped_loss
power_interval = outer(p0, ones(z_interval.size))
alphaz = outer(alpha, z_interval)
expz = exp(- alphaz)
eff_length = 1 / outer(alpha, ones(z_interval.size)) * (1 - expz)
crpz = transpose(ones([z_interval.size, cr.shape[0], cr.shape[1]]) * cr * p0, (1, 2, 0))
exponent = - alphaz
if sim_params.raman_params.order >= 1:
gamma1 = sum(crpz * eff_length, 1)
exponent += gamma1
if sim_params.raman_params.order >= 2:
z_integrand = expz * gamma1
z_integral = cumsum((z_integrand[:, :-1] + z_integrand[:, 1:]) / 2 * dz, 1)
gamma2 = zeros(gamma1.shape)
gamma2[:, 1:] = sum(crpz[:, :, 1:] * z_integral, 1)
exponent += gamma2
if sim_params.raman_params.order >= 3:
z_integrand = expz * (gamma2 + 1/2 * gamma1**2)
z_integral = cumsum((z_integrand[:, :-1] + z_integrand[:, 1:]) / 2 * dz, 1)
gamma3 = zeros(gamma1.shape)
gamma3[:, 1:] = sum(crpz[:, :, 1:] * z_integral, 1)
exponent += gamma3
if sim_params.raman_params.order >= 4:
z_integrand = expz * (gamma3 + gamma1 * gamma2 + 1/factorial(3) * gamma1**3)
z_integral = cumsum((z_integrand[:, :-1] + z_integrand[:, 1:]) / 2 * dz, 1)
gamma4 = zeros(gamma1.shape)
gamma4[:, 1:] = sum(crpz[:, :, 1:] * z_integral, 1)
exponent += gamma4
power_interval *= exp(exponent)
power[:, interval[1:]] = power_interval[:, 1:]
power_in = power_interval[:, -1]
elif sim_params.raman_params.method == 'numerical':
dz = z[1:] - z[:-1]
power = outer(power_in, ones(z.size))
for i in range(1, z.size):
power[:, i] = \
power[:, i - 1] * (1 + (- alpha + sum(cr * power[:, i - 1], 1)) * dz[i - 1]) * lumped_losses[i - 1]
power[:, i] = (power[:, i - 1] * (1 + (- alpha + sum(cr * power[:, i - 1], 1)) * dz[i - 1]) *
lumped_losses[i - 1])
else:
raise ValueError(f'Method {sim_params.raman_params.method} not implemented in Raman Solver.')
return power
@staticmethod
def iterative_algorithm(co_initial_guess_power, cnt_initial_guess_power, co_frequency, cnt_frequency, z, fiber,
lumped_losses):
"""Solves the Raman first order derivative equation in case of both co- and counter-propagating
frequencies
"""Solves the Raman equation in case of both co- and counter-propagating frequencies
:param co_initial_guess_power: co-propagationg Raman first order derivative equation solution
:param cnt_initial_guess_power: counter-propagationg Raman first order derivative equation solution
@@ -276,6 +327,7 @@ class NliSolver:
List of implemented methods:
'gn_model_analytic': eq. 120 from arXiv:1209.0394
'ggn_spectrally_separated': eq. 21 from arXiv: 1710.02225
'ggn_approx': eq. 24-25 jlt:9741324
"""
SPM_WEIGHT = (16.0 / 27.0)
@@ -305,6 +357,10 @@ class NliSolver:
elif 'ggn_spectrally_separated' in sim_params.nli_params.method:
if sim_params.nli_params.computed_channels is not None:
cut_indices = array(sim_params.nli_params.computed_channels) - 1
elif sim_params.nli_params.computed_number_of_channels is not None:
nb_ch_computed = sim_params.nli_params.computed_number_of_channels
nb_ch = len(spectral_info.channel_number)
cut_indices = array([round(i * (nb_ch - 1) / (nb_ch_computed - 1)) for i in range(0, nb_ch_computed)])
else:
cut_indices = array(spectral_info.channel_number) - 1
@@ -316,6 +372,28 @@ class NliSolver:
pump_power = outer(ones(cut_indices.size), spectral_info.signal)
cut_baud_rate = outer(spectral_info.baud_rate[cut_indices], ones(spectral_info.number_of_channels))
g_nli = eta * cut_power * pump_power**2 / cut_baud_rate
g_nli = sum(g_nli, 1)
g_nli = interp(spectral_info.frequency, cut_frequency, g_nli)
nli = spectral_info.baud_rate * g_nli # Local white noise
elif 'ggn_approx' in sim_params.nli_params.method:
if sim_params.nli_params.computed_channels is not None:
cut_indices = array(sim_params.nli_params.computed_channels) - 1
elif sim_params.nli_params.computed_number_of_channels is not None:
nb_ch_computed = sim_params.nli_params.computed_number_of_channels
nb_ch = len(spectral_info.channel_number)
cut_indices = array([round(i * (nb_ch - 1) / (nb_ch_computed - 1)) for i in range(0, nb_ch_computed)])
else:
cut_indices = array(spectral_info.channel_number) - 1
eta = NliSolver._ggn_approx(cut_indices, spectral_info, fiber, srs)
# Interpolation over the channels not indicated as computed channels in simulation parameters
cut_power = outer(spectral_info.signal[cut_indices], ones(spectral_info.number_of_channels))
cut_frequency = spectral_info.frequency[cut_indices]
pump_power = outer(ones(cut_indices.size), spectral_info.signal)
cut_baud_rate = outer(spectral_info.baud_rate[cut_indices], ones(spectral_info.number_of_channels))
g_nli = eta * cut_power * pump_power ** 2 / cut_baud_rate
g_nli = sum(g_nli, 1)
g_nli = interp(spectral_info.frequency, cut_frequency, g_nli)
@@ -522,6 +600,89 @@ class NliSolver:
freq_offset_th = ((k_ref * delta_f_ref) * rs_ref * beta2_ref) / (beta2 * symbol_rate)
return freq_offset_th
@staticmethod
def _ggn_approx(cut_indices, spectral_info: SpectralInformation, fiber, srs, spm_weight=SPM_WEIGHT,
xpm_weight=XPM_WEIGHT):
"""Computes the nonlinear interference power evaluated at the fiber input.
The method uses eq. 24-25 of https://ieeexplore.ieee.org/document/9741324
"""
# Spectral Features
nch = spectral_info.number_of_channels
frequency = spectral_info.frequency
baud_rate = spectral_info.baud_rate
slot_width = spectral_info.slot_width
roll_off = spectral_info.roll_off
df = spectral_info.df + diag(full(nch, nan))
# Physical fiber parameters
alpha = fiber.alpha(frequency)
beta2 = fiber.beta2(frequency)
gamma = outer(fiber.gamma(frequency[cut_indices]), ones(nch))
identity = diag(ones(nch))
weight = spm_weight * identity + xpm_weight * (ones([nch, nch]) - identity)
weight = weight[cut_indices, :]
dispersion_tolerance = sim_params.nli_params.dispersion_tolerance
phase_shift_tolerance = sim_params.nli_params.phase_shift_tolerance
max_slot_width = max(slot_width)
max_beta2 = max(abs(beta2))
delta_z = sim_params.raman_params.result_spatial_resolution
# Approximation psi
loss_profile = srs.loss_profile[:nch]
z = srs.z
psi = NliSolver._approx_psi(df=df, frequency=frequency, beta2=beta2, baud_rate=baud_rate,
loss_profile=loss_profile, z=z)
# GGN for SPM
for cut_index in cut_indices:
dn = 0
cut_frequency = frequency[cut_index]
cut_baud_rate = baud_rate[cut_index]
cut_roll_off = roll_off[cut_index]
cut_beta2 = beta2[cut_index]
cut_alpha = alpha[cut_index]
k_tol = dispersion_tolerance * abs(cut_alpha)
phi_tol = phase_shift_tolerance / delta_z
f_cut_resolution = min(k_tol, phi_tol) / abs(max_beta2) / (4 * pi ** 2 * (1 + dn) * max_slot_width)
f_pump_resolution = min(k_tol, phi_tol) / abs(max_beta2) / (4 * pi ** 2 * max_slot_width)
psi[cut_index, cut_index] = NliSolver._generalized_psi(cut_frequency, cut_frequency, cut_baud_rate,
cut_roll_off, cut_frequency, cut_baud_rate,
cut_roll_off, f_cut_resolution, f_pump_resolution,
srs, cut_alpha, cut_beta2, 0, cut_frequency)
psi = psi[cut_indices, :]
cut_baud_rate = outer(baud_rate[cut_indices], ones(nch))
pump_baud_rate = outer(ones(cut_indices.size), baud_rate)
eta_cut_central_frequency = \
gamma ** 2 * weight * psi / (cut_baud_rate * pump_baud_rate ** 2)
eta = cut_baud_rate * eta_cut_central_frequency # Local white noise
return eta
@staticmethod
def _approx_psi(df, frequency, baud_rate, beta2, loss_profile, z):
"""Computes the approximated psi function similarly to the one used in the GN model.
The method uses eq. 25 of https://ieeexplore.ieee.org/document/9741324"""
pump_baud_rate = outer(ones(frequency.size), baud_rate)
cut_beta = outer(beta2, ones(frequency.size))
pump_beta = outer(ones(frequency.size), beta2)
delta_z = abs(z[:-1] - z[1:])
loss_lin = log(loss_profile)
pump_alpha = (loss_lin[:, 1:] - loss_lin[:, :-1]) / delta_z
leff = abs((loss_profile[:, 1:] - loss_profile[:, :-1]) / sqrt(abs(pump_alpha))) * pump_alpha / abs(pump_alpha)
leff = reshape(outer(leff, ones(z.size - 1)), newshape=[leff.shape[0], leff.shape[1], leff.shape[1]])
leff2 = leff * swapaxes(leff, 2, 1)
leff2 = sum(leff2, axis=(1, 2))
z_int = outer(ones(frequency.size), leff2)
delta_beta = (cut_beta + pump_beta) / 2
psi = z_int * pump_baud_rate / (4 * pi * abs(delta_beta * df))
return psi
def estimate_nf_model(type_variety, gain_min, gain_max, nf_min, nf_max):
if nf_min < -10:

View File

@@ -9,9 +9,10 @@ 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, mean
from numpy import pi, cos, sqrt, log10, linspace, zeros, shape, where, logical_and, mean, array
from scipy import constants
from copy import deepcopy
from typing import List, Union
from gnpy.core.exceptions import ConfigurationError
@@ -213,17 +214,6 @@ wavelength2freq = constants.lambda2nu
freq2wavelength = constants.nu2lambda
def freq2wavelength(value):
"""Converts frequency units to wavelength units.
>>> round(freq2wavelength(191.35e12) * 1e9, 3)
1566.723
>>> round(freq2wavelength(196.1e12) * 1e9, 3)
1528.773
"""
return constants.c / value
def snr_sum(snr, bw, snr_added, bw_added=12.5e9):
snr_added = snr_added - lin2db(bw / bw_added)
snr = -lin2db(db2lin(-snr) + db2lin(-snr_added))
@@ -452,3 +442,119 @@ def restore_order(elements, order):
[3, 2, 7]
"""
return [elements[i[0]] for i in sorted(enumerate(order), key=lambda x:x[1]) if elements[i[0]] is not None]
def unique_ordered(elements):
"""
"""
unique_elements = []
for element in elements:
if element not in unique_elements:
unique_elements.append(element)
return unique_elements
def calculate_absolute_min_or_zero(x: array) -> array:
"""Calculates the element-wise absolute minimum between the x and zero.
Parameters:
x (array): The first input array.
Returns:
array: The element-wise absolute minimum between x and zero.
Example:
>>> x = array([-1, 2, -3])
>>> calculate_absolute_min_or_zero(x)
array([1., 0., 3.])
"""
return (abs(x) - x) / 2
def nice_column_str(data: List[List[str]], max_length: int = 30, padding: int = 1) -> str:
"""data is a list of rows, creates strings with nice alignment per colum and padding with spaces
letf justified
>>> table_data = [['aaa', 'b', 'c'], ['aaaaaaaa', 'bbb', 'c'], ['a', 'bbbbbbbbbb', 'c']]
>>> print(nice_column_str(table_data))
aaa b c
aaaaaaaa bbb c
a bbbbbbbbbb c
"""
# transpose data to determine size of columns
transposed_data = list(map(list, zip(*data)))
column_width = [max(len(word) for word in column) + padding for column in transposed_data]
nice_str = []
for row in data:
column = ''.join(word[0:max_length].ljust(min(width, max_length)) for width, word in zip(column_width, row))
nice_str.append(f'{column}')
return '\n'.join(nice_str)
def find_common_range(amp_bands: List[List[dict]], default_band_f_min: float, default_band_f_max: float) \
-> List[dict]:
"""Find the common frequency range of bands
If there are no amplifiers in the path, then use default band
>>> amp_bands = [[{'f_min': 191e12, 'f_max' : 195e12}, {'f_min': 186e12, 'f_max' : 190e12} ], \
[{'f_min': 185e12, 'f_max' : 189e12}, {'f_min': 192e12, 'f_max' : 196e12}], \
[{'f_min': 186e12, 'f_max': 193e12}]]
>>> find_common_range(amp_bands, 190e12, 195e12)
[{'f_min': 186000000000000.0, 'f_max': 189000000000000.0}, {'f_min': 192000000000000.0, 'f_max': 193000000000000.0}]
>>> amp_bands = [[{'f_min': 191e12, 'f_max' : 195e12}, {'f_min': 186e12, 'f_max' : 190e12} ], \
[{'f_min': 185e12, 'f_max' : 189e12}, {'f_min': 192e12, 'f_max' : 196e12}], \
[{'f_min': 186e12, 'f_max': 192e12}]]
>>> find_common_range(amp_bands, 190e12, 195e12)
[{'f_min': 186000000000000.0, 'f_max': 189000000000000.0}]
"""
_amp_bands = [sorted(amp, key=lambda x: x['f_min']) for amp in amp_bands]
_temp = []
# remove None bands
for amp in _amp_bands:
is_band = True
for band in amp:
if not (is_band and band['f_min'] and band['f_max']):
is_band = False
if is_band:
_temp.append(amp)
# remove duplicate
unique_amp_bands = []
for amp in _temp:
if amp not in unique_amp_bands:
unique_amp_bands.append(amp)
if unique_amp_bands:
common_range = unique_amp_bands[0]
else:
if default_band_f_min is None or default_band_f_max is None:
return []
common_range = [{'f_min': default_band_f_min, 'f_max': default_band_f_max}]
for bands in unique_amp_bands:
common_range = [{'f_min': max(first['f_min'], second['f_min']), 'f_max': min(first['f_max'], second['f_max'])}
for first in common_range for second in bands
if max(first['f_min'], second['f_min']) < min(first['f_max'], second['f_max'])]
return sorted(common_range, key=lambda x: x['f_min'])
def transform_data(data: str) -> Union[List[int], None]:
"""Transforms a float into an list of one integer or a string separated by "|" into a list of integers.
Args:
data (float or str): The data to transform.
Returns:
list of int: The transformed data as a list of integers.
Examples:
>>> transform_data(5.0)
[5]
>>> transform_data('1 | 2 | 3')
[1, 2, 3]
"""
if isinstance(data, float):
return [int(data)]
if isinstance(data, str):
return [int(x) for x in data.split(' | ')]
return None

View File

@@ -1,108 +0,0 @@
{
"nf_ripple": [
0.0
],
"gain_ripple": [
0.0
],
"f_min": 191.35e12,
"f_max": 196.1e12,
"dgt": [
1.0,
1.017807767853702,
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

@@ -1,6 +1,7 @@
{
"network_name": "EDFA Example Network - P2P",
"elements": [{
"elements": [
{
"uid": "Site_A",
"type": "Transceiver",
"metadata": {
@@ -61,9 +62,9 @@
}
}
}
],
"connections": [{
"connections": [
{
"from_node": "Site_A",
"to_node": "Span1"
},
@@ -75,6 +76,5 @@
"from_node": "Edfa1",
"to_node": "Site_B"
}
]
}

View File

@@ -1,4 +1,6 @@
{ "Edfa":[{
{
"Edfa": [
{
"type_variety": "high_detail_model_example",
"type_def": "advanced_model",
"gain_flatmax": 25,
@@ -7,7 +9,8 @@
"advanced_config_from_json": "std_medium_gain_advanced_config.json",
"out_voa_auto": false,
"allowed_for_design": false
}, {
},
{
"type_variety": "Juniper_BoosterHG",
"type_def": "advanced_model",
"gain_flatmax": 25,
@@ -34,7 +37,12 @@
"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
],
"allowed_for_design": false
},
{
@@ -43,7 +51,12 @@
"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
],
"allowed_for_design": false
},
{
@@ -60,7 +73,12 @@
"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
],
"allowed_for_design": false
},
{
@@ -69,7 +87,12 @@
"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
],
"allowed_for_design": false
},
{
@@ -177,7 +200,8 @@
"allowed_for_design": false
}
],
"Fiber":[{
"Fiber": [
{
"type_variety": "SSMF",
"dispersion": 1.67e-05,
"effective_area": 83e-12,
@@ -196,16 +220,22 @@
"pmd_coef": 1.265e-15
}
],
"RamanFiber":[{
"RamanFiber": [
{
"type_variety": "SSMF",
"dispersion": 1.67e-05,
"effective_area": 83e-12,
"pmd_coef": 1.265e-15
}
],
"Span":[{
"Span": [
{
"power_mode": true,
"delta_power_range_db": [-2,3,0.5],
"delta_power_range_db": [
-2,
3,
0.5
],
"max_fiber_lineic_loss_for_raman": 0.25,
"target_extended_gain": 2.5,
"max_length": 150,
@@ -217,7 +247,8 @@
"con_out": 0
}
],
"Roadm":[{
"Roadm": [
{
"target_pch_out_db": -20,
"add_drop_osnr": 38,
"pmd": 0,
@@ -226,18 +257,109 @@
"preamp_variety_list": [],
"booster_variety_list": []
}
}],
"SI":[{
},
{
"type_variety": "roadm_type_1",
"target_pch_out_db": -18,
"add_drop_osnr": 35,
"pmd": 0,
"pdl": 0,
"restrictions": {
"preamp_variety_list": [],
"booster_variety_list": []
},
"roadm-path-impairments": []
},
{
"type_variety": "detailed_impairments",
"target_pch_out_db": -20,
"add_drop_osnr": 38,
"pmd": 0,
"pdl": 0,
"restrictions": {
"preamp_variety_list": [],
"booster_variety_list": []
},
"roadm-path-impairments": [
{
"roadm-path-impairments-id": 0,
"roadm-express-path": [
{
"frequency-range": {
"lower-frequency": 191.3e12,
"upper-frequency": 196.1e12
},
"roadm-pmd": 0,
"roadm-cd": 0,
"roadm-pdl": 0,
"roadm-inband-crosstalk": 0,
"roadm-maxloss": 16.5
}
]
},
{
"roadm-path-impairments-id": 1,
"roadm-add-path": [
{
"frequency-range": {
"lower-frequency": 191.3e12,
"upper-frequency": 196.1e12
},
"roadm-pmd": 0,
"roadm-cd": 0,
"roadm-pdl": 0,
"roadm-inband-crosstalk": 0,
"roadm-maxloss": 11.5,
"roadm-pmax": 2.5,
"roadm-osnr": 41,
"roadm-noise-figure": 23
}
]
},
{
"roadm-path-impairments-id": 2,
"roadm-drop-path": [
{
"frequency-range": {
"lower-frequency": 191.3e12,
"upper-frequency": 196.1e12
},
"roadm-pmd": 0,
"roadm-cd": 0,
"roadm-pdl": 0,
"roadm-inband-crosstalk": 0,
"roadm-maxloss": 11.5,
"roadm-minloss": 7.5,
"roadm-typloss": 10,
"roadm-pmin": -13.5,
"roadm-pmax": -9.5,
"roadm-ptyp": -12,
"roadm-osnr": 41,
"roadm-noise-figure": 15
}
]
}
]
}
],
"SI": [
{
"f_min": 191.3e12,
"baud_rate": 32e9,
"f_max": 195.1e12,
"spacing": 50e9,
"power_dbm": 0,
"power_range_db": [0,0,1],
"power_range_db": [
0,
0,
1
],
"tx_power_dbm": 0,
"roll_off": 0.15,
"tx_osnr": 40,
"sys_margins": 2
}],
}
],
"Transceiver": [
{
"type_variety": "vendorA_trx-type1",
@@ -247,7 +369,6 @@
},
"mode": [
{
"format": "mode 1",
"baud_rate": 32e9,
"OSNR": 11,
@@ -319,5 +440,4 @@
]
}
]
}

View File

@@ -0,0 +1,479 @@
{
"Edfa": [
{
"type_variety": "std_high_gain",
"type_def": "variable_gain",
"gain_flatmax": 35,
"gain_min": 25,
"p_max": 21,
"nf_min": 5.5,
"nf_max": 7,
"out_voa_auto": false,
"allowed_for_design": true
},
{
"type_variety": "std_medium_gain",
"type_def": "variable_gain",
"gain_flatmax": 26,
"gain_min": 15,
"p_max": 23,
"nf_min": 6,
"nf_max": 10,
"out_voa_auto": false,
"allowed_for_design": true
},
{
"type_variety": "std_low_gain",
"type_def": "variable_gain",
"gain_flatmax": 16,
"gain_min": 8,
"p_max": 23,
"nf_min": 6.5,
"nf_max": 11,
"out_voa_auto": false,
"allowed_for_design": true
},
{
"type_variety": "high_power",
"type_def": "variable_gain",
"gain_flatmax": 16,
"gain_min": 8,
"p_max": 25,
"nf_min": 9,
"nf_max": 15,
"out_voa_auto": false,
"allowed_for_design": false
},
{
"type_variety": "std_fixed_gain",
"type_def": "fixed_gain",
"gain_flatmax": 21,
"gain_min": 20,
"p_max": 21,
"nf0": 5.5,
"allowed_for_design": false
},
{
"type_variety": "4pumps_raman",
"type_def": "fixed_gain",
"gain_flatmax": 12,
"gain_min": 12,
"p_max": 21,
"nf0": -1,
"allowed_for_design": false
},
{
"type_variety": "hybrid_4pumps_lowgain",
"type_def": "dual_stage",
"raman": true,
"gain_min": 25,
"preamp_variety": "4pumps_raman",
"booster_variety": "std_low_gain",
"allowed_for_design": true
},
{
"type_variety": "hybrid_4pumps_mediumgain",
"type_def": "dual_stage",
"raman": true,
"gain_min": 25,
"preamp_variety": "4pumps_raman",
"booster_variety": "std_medium_gain",
"allowed_for_design": true
},
{
"type_variety": "medium+low_gain",
"type_def": "dual_stage",
"gain_min": 25,
"preamp_variety": "std_medium_gain",
"booster_variety": "std_low_gain",
"allowed_for_design": true
},
{
"type_variety": "medium+high_power",
"type_def": "dual_stage",
"gain_min": 25,
"preamp_variety": "std_medium_gain",
"booster_variety": "high_power",
"allowed_for_design": false
},
{
"type_variety": "std_medium_gain_C",
"f_min": 191.225e12,
"f_max": 196.125e12,
"type_def": "variable_gain",
"gain_flatmax": 26,
"gain_min": 15,
"p_max": 21,
"nf_min": 6,
"nf_max": 10,
"out_voa_auto": false,
"allowed_for_design": false
},
{
"type_variety": "std_medium_gain_L",
"f_min": 186.5e12,
"f_max": 190.1e12,
"type_def": "variable_gain",
"gain_flatmax": 26,
"gain_min": 15,
"p_max": 21,
"nf_min": 6,
"nf_max": 10,
"out_voa_auto": false,
"allowed_for_design": true
},
{
"type_variety": "std_low_gain",
"f_min": 191.25e12,
"f_max": 196.15e12,
"type_def": "variable_gain",
"gain_flatmax": 16,
"gain_min": 8,
"p_max": 21,
"nf_min": 7,
"nf_max": 11,
"out_voa_auto": false,
"allowed_for_design": true
},
{
"type_variety": "std_low_gain_reduced_band",
"f_min": 192.25e12,
"f_max": 196.15e12,
"type_def": "variable_gain",
"gain_flatmax": 16,
"gain_min": 8,
"p_max": 21,
"nf_min": 7,
"nf_max": 11,
"out_voa_auto": false,
"allowed_for_design": true
},
{
"type_variety": "std_low_gain_bis",
"f_min": 191.25e12,
"f_max": 196.15e12,
"type_def": "variable_gain",
"gain_flatmax": 16,
"gain_min": 8,
"p_max": 21,
"nf_min": 6,
"nf_max": 10,
"out_voa_auto": false,
"allowed_for_design": true
},
{
"type_variety": "std_low_gain_L_ter",
"f_min": 186.55e12,
"f_max": 190.05e12,
"type_def": "variable_gain",
"gain_flatmax": 16,
"gain_min": 8,
"p_max": 16,
"nf_min": 7,
"nf_max": 11,
"out_voa_auto": false,
"allowed_for_design": true
},
{
"type_variety": "std_low_gain_L",
"f_min": 186.55e12,
"f_max": 190.05e12,
"type_def": "variable_gain",
"gain_flatmax": 16,
"gain_min": 8,
"p_max": 21,
"nf_min": 7,
"nf_max": 11,
"out_voa_auto": false,
"allowed_for_design": true
},
{
"type_variety": "std_low_gain_L_reduced_band",
"f_min": 187.3e12,
"f_max": 190.05e12,
"type_def": "variable_gain",
"gain_flatmax": 16,
"gain_min": 8,
"p_max": 21,
"nf_min": 7,
"nf_max": 11,
"out_voa_auto": false,
"allowed_for_design": true
},
{
"type_variety": "test",
"type_def": "variable_gain",
"gain_flatmax": 25,
"gain_min": 15,
"p_max": 21,
"nf_min": 5.8,
"nf_max": 10,
"out_voa_auto": false,
"allowed_for_design": true
},
{
"type_variety": "test_fixed_gain",
"type_def": "fixed_gain",
"gain_flatmax": 21,
"gain_min": 20,
"p_max": 21,
"nf0": 5,
"allowed_for_design": true
},
{
"type_variety": "std_booster",
"type_def": "fixed_gain",
"gain_flatmax": 21,
"gain_min": 20,
"p_max": 21,
"nf0": 5,
"allowed_for_design": false
},
{
"type_variety": "std_booster_L",
"f_min": 186.55e12,
"f_max": 190.05e12,
"type_def": "fixed_gain",
"gain_flatmax": 21,
"gain_min": 20,
"p_max": 21,
"nf0": 5,
"allowed_for_design": false
},
{
"type_variety": "std_booster_multiband",
"type_def": "multi_band",
"amplifiers": [
"std_booster",
"std_booster_L"
],
"allowed_for_design": false
},
{
"type_variety": "std_medium_gain_multiband",
"type_def": "multi_band",
"amplifiers": [
"std_medium_gain_C",
"std_medium_gain_L"
],
"allowed_for_design": false
},
{
"type_variety": "std_low_gain_multiband",
"type_def": "multi_band",
"amplifiers": [
"std_low_gain",
"std_low_gain_L"
],
"allowed_for_design": false
},
{
"type_variety": "std_low_gain_multiband_ter",
"type_def": "multi_band",
"amplifiers": [
"std_low_gain",
"std_low_gain_L_ter"
],
"allowed_for_design": false
},
{
"type_variety": "std_low_gain_multiband_bis",
"type_def": "multi_band",
"amplifiers": [
"std_low_gain_bis",
"std_low_gain_L"
],
"allowed_for_design": true
},
{
"type_variety": "std_low_gain_multiband_reduced",
"type_def": "multi_band",
"amplifiers": [
"std_low_gain_reduced",
"std_low_gain_L"
],
"allowed_for_design": true
},
{
"type_variety": "std_low_gain_multiband_reduced",
"type_def": "multi_band",
"amplifiers": [
"std_low_gain_bis",
"std_low_gain_L_reduced_band"
],
"allowed_for_design": true
}
],
"Fiber": [
{
"type_variety": "SSMF",
"dispersion": 1.67e-05,
"effective_area": 83e-12,
"pmd_coef": 1.265e-15
},
{
"type_variety": "NZDF",
"dispersion": 0.5e-05,
"effective_area": 72e-12,
"pmd_coef": 1.265e-15
},
{
"type_variety": "LOF",
"dispersion": 2.2e-05,
"effective_area": 125e-12,
"pmd_coef": 1.265e-15
}
],
"RamanFiber": [
{
"type_variety": "SSMF",
"dispersion": 1.67e-05,
"effective_area": 83e-12,
"pmd_coef": 1.265e-15
}
],
"Span": [
{
"power_mode": true,
"delta_power_range_db": [
-2,
3,
0.5
],
"max_fiber_lineic_loss_for_raman": 0.25,
"target_extended_gain": 2.5,
"max_length": 150,
"length_units": "km",
"max_loss": 28,
"padding": 10,
"EOL": 0,
"con_in": 0,
"con_out": 0
}
],
"Roadm": [
{
"target_pch_out_db": -20,
"add_drop_osnr": 38,
"pmd": 0,
"pdl": 0,
"restrictions": {
"preamp_variety_list": [],
"booster_variety_list": []
}
}
],
"SI": [
{
"f_min": 191.3e12,
"baud_rate": 32e9,
"f_max": 195.1e12,
"spacing": 50e9,
"power_dbm": 0,
"power_range_db": [
0,
0,
1
],
"roll_off": 0.15,
"tx_osnr": 40,
"sys_margins": 2
},
{
"type_variety": "lband",
"f_min": 186.3e12,
"baud_rate": 32e9,
"f_max": 190.1e12,
"spacing": 50e9,
"power_dbm": 0,
"power_range_db": [
0,
0,
1
],
"roll_off": 0.15,
"tx_osnr": 40,
"sys_margins": 2
}
],
"Transceiver": [
{
"type_variety": "vendorA_trx-type1",
"frequency": {
"min": 191.35e12,
"max": 196.1e12
},
"mode": [
{
"format": "mode 1",
"baud_rate": 32e9,
"OSNR": 11,
"bit_rate": 100e9,
"roll_off": 0.15,
"tx_osnr": 40,
"min_spacing": 37.5e9,
"cost": 1
},
{
"format": "mode 2",
"baud_rate": 66e9,
"OSNR": 15,
"bit_rate": 200e9,
"roll_off": 0.15,
"tx_osnr": 40,
"min_spacing": 75e9,
"cost": 1
}
]
},
{
"type_variety": "Voyager",
"frequency": {
"min": 191.35e12,
"max": 196.1e12
},
"mode": [
{
"format": "mode 1",
"baud_rate": 32e9,
"OSNR": 12,
"bit_rate": 100e9,
"roll_off": 0.15,
"tx_osnr": 40,
"min_spacing": 37.5e9,
"cost": 1
},
{
"format": "mode 3",
"baud_rate": 44e9,
"OSNR": 18,
"bit_rate": 300e9,
"roll_off": 0.15,
"tx_osnr": 40,
"min_spacing": 62.5e9,
"cost": 1
},
{
"format": "mode 2",
"baud_rate": 66e9,
"OSNR": 21,
"bit_rate": 400e9,
"roll_off": 0.15,
"tx_osnr": 40,
"min_spacing": 75e9,
"cost": 1
},
{
"format": "mode 4",
"baud_rate": 66e9,
"OSNR": 16,
"bit_rate": 200e9,
"roll_off": 0.15,
"tx_osnr": 40,
"min_spacing": 75e9,
"cost": 1
}
]
}
]
}

View File

@@ -6,7 +6,12 @@
"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
@@ -17,7 +22,12 @@
"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
@@ -74,7 +84,11 @@
"Span": [
{
"power_mode": true,
"delta_power_range_db": [0, 0, 0],
"delta_power_range_db": [
0,
0,
0
],
"max_fiber_lineic_loss_for_raman": 0.25,
"target_extended_gain": 0,
"max_length": 135,
@@ -93,8 +107,12 @@
"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"
]
}
}
],
@@ -105,7 +123,11 @@
"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

View File

@@ -6,7 +6,12 @@
"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
@@ -17,7 +22,12 @@
"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
@@ -28,7 +38,12 @@
"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
@@ -39,7 +54,12 @@
"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
@@ -86,7 +106,11 @@
"Span": [
{
"power_mode": true,
"delta_power_range_db": [0, 0, 0],
"delta_power_range_db": [
0,
0,
0
],
"max_fiber_lineic_loss_for_raman": 0.25,
"target_extended_gain": 0,
"max_length": 135,
@@ -105,8 +129,12 @@
"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"
]
}
}
],
@@ -117,7 +145,11 @@
"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

View File

@@ -0,0 +1,74 @@
{
"Edfa": [
{
"type_variety": "user_defined",
"type_def": "variable_gain",
"f_min": 192.0e12,
"f_max": 195.9e12,
"gain_flatmax": 25,
"gain_min": 15,
"p_max": 21,
"nf_min": 6,
"nf_max": 10,
"default_config_from_json": "user_edfa_config.json",
"out_voa_auto": false,
"allowed_for_design": true
}, {
"type_variety": "user_high_detail_model_example",
"type_def": "advanced_model",
"gain_flatmax": 25,
"gain_min": 15,
"p_max": 21,
"advanced_config_from_json": "std_medium_gain_advanced_config.json",
"out_voa_auto": false,
"allowed_for_design": false
}
],
"Transceiver": [
{
"type_variety": "ZR400G",
"frequency": {
"min": 191.3e12,
"max": 196.1e12
},
"mode": [
{
"format": "SFF-ID:70",
"baud_rate": 60138546798,
"OSNR": 24,
"bit_rate": 400e9,
"roll_off": 0.2,
"tx_osnr": 34,
"min_spacing": 75e9,
"penalties": [
{
"chromatic_dispersion": 20e3,
"penalty_value": 0.5
},
{
"chromatic_dispersion": 0,
"penalty_value": 0
},
{
"pmd": 20,
"penalty_value": 0.5
},
{
"pdl": 1.5,
"penalty_value": 0
},
{
"pdl": 3.5,
"penalty_value": 1.8
},
{
"pdl": 3,
"penalty_value": 1.3
}
],
"cost": 1
}
]
}
]
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,24 @@
{
"spectrum": [
{
"f_min": 191.25e12,
"baud_rate": 32e9,
"f_max": 195.1e12,
"slot_width": 50e9,
"delta_pdb": 0,
"roll_off": 0.15,
"tx_osnr": 40,
"label": "cband"
},
{
"f_min": 186.3e12,
"baud_rate": 32e9,
"f_max": 190.1e12,
"slot_width": 50e9,
"delta_pdb": 0,
"roll_off": 0.15,
"tx_osnr": 40,
"label": "lband"
}
]
}

View File

@@ -0,0 +1,22 @@
{
"path-request": [
{
"request-id": "0",
"source": "trx Brest_KLA",
"destination": "trx Lannion_CAS",
"src-tp-id": "trx Brest_KLA",
"dst-tp-id": "trx Lannion_CAS",
"bidirectional": false,
"path-constraints": {
"te-bandwidth": {
"technology": "flexi-grid",
"trx_type": "ZR400G",
"trx_mode": "SFF-ID:70",
"spacing": 100000000000.0,
"tx_power": 0.0015,
"path_bandwidth": 400000000000.0
}
}
}
]
}

View File

@@ -8,6 +8,12 @@
"method": "ggn_spectrally_separated",
"dispersion_tolerance": 1,
"phase_shift_tolerance": 0.1,
"computed_channels": [1, 18, 37, 56, 75]
"computed_channels": [
1,
18,
37,
56,
75
]
}
}

View File

@@ -5,8 +5,8 @@
0.0359549,
5.82851
],
"f_min": 191.35e12,
"f_max": 196.1e12,
"f_min": 191.275e12,
"f_max": 196.125e12,
"nf_ripple": [
0.4372876328262819,
0.4372876328262819,

View File

@@ -11,28 +11,28 @@ Common code for CLI examples
import argparse
import logging
import sys
from math import ceil
from numpy import linspace, mean
from pathlib import Path
from typing import List
from math import ceil
from numpy import mean
import gnpy.core.ansi_escapes as ansi_escapes
from gnpy.core import ansi_escapes
from gnpy.core.elements import Transceiver, Fiber, RamanFiber
from gnpy.core.equipment import trx_mode_params
import gnpy.core.exceptions as exceptions
from gnpy.core.network import add_missing_elements_in_network, design_network
from gnpy.core import exceptions
from gnpy.core.parameters import SimParams
from gnpy.core.utils import db2lin, lin2db, automatic_nch, watt2dbm, dbm2watt
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, load_initial_spectrum)
from gnpy.core.utils import lin2db, pretty_summary_print, per_label_average, watt2dbm
from gnpy.topology.request import (ResultElement, jsontocsv, BLOCKING_NOPATH)
from gnpy.tools.json_io import (load_equipments_and_configs, load_network, load_json, load_requests, save_network,
requests_from_json, save_json, load_initial_spectrum, DEFAULT_EQPT_CONFIG)
from gnpy.tools.plots import plot_baseline, plot_results
from gnpy.tools.worker_utils import designed_network, transmission_simulation, planning
_logger = logging.getLogger(__name__)
_examples_dir = Path(__file__).parent.parent / 'example-data'
_default_config_files = ['example-data/std_medium_gain_advanced_config.json',
'example-data/Juniper-BoosterHG.json',
'parameters.DEFAULT_EDFA_CONFIG']
_help_footer = '''
This program is part of GNPy, https://github.com/TelecomInfraProject/oopt-gnpy
@@ -47,11 +47,12 @@ def show_example_data_dir():
print(f'{_examples_dir}/')
def load_common_data(equipment_filename, topology_filename, simulation_filename, save_raw_network_filename):
"""Load common configuration from JSON files"""
def load_common_data(equipment_filename: Path, extra_equipment_filenames: List[Path], extra_config_filenames: List[Path],
topology_filename: Path, simulation_filename: Path, save_raw_network_filename: Path):
"""Load common configuration from JSON files, merging additional equipment if provided."""
try:
equipment = load_equipment(equipment_filename)
equipment = load_equipments_and_configs(equipment_filename, extra_equipment_filenames, extra_config_filenames)
network = load_network(topology_filename, equipment)
if save_raw_network_filename is not None:
save_network(network, save_raw_network_filename)
@@ -95,7 +96,7 @@ def _add_common_options(parser: argparse.ArgumentParser, network_default: Path):
parser.add_argument('-v', '--verbose', action='count', default=0,
help='Increase verbosity (can be specified several times)')
parser.add_argument('-e', '--equipment', type=Path, metavar=_help_fname_json,
default=_examples_dir / 'eqpt_config.json', help='Equipment library')
default=DEFAULT_EQPT_CONFIG, help='Equipment library')
parser.add_argument('--sim-params', type=Path, metavar=_help_fname_json,
default=None, help='Path to the JSON containing simulation parameters (required for Raman). '
f'Example: {_examples_dir / "sim_params.json"}')
@@ -106,9 +107,22 @@ def _add_common_options(parser: argparse.ArgumentParser, network_default: Path):
parser.add_argument('--no-insert-edfas', action='store_true',
help='Disable insertion of EDFAs after ROADMs and fibers '
'as well as splitting of fibers by auto-design.')
# Option for additional equipment files
parser.add_argument('--extra-equipment', nargs='+', type=Path,
metavar=_help_fname_json, default=None,
help='List of additional equipment files to complement the main equipment file.')
# Option for additional config files
parser.add_argument('--extra-config', nargs='+', type=Path,
metavar=_help_fname_json,
help='List of additional config files as referenced in equipment files with '
'"advanced_config_from_json" or "default_config_from_json".'
f'Existing configs:\n{_default_config_files}')
def transmission_main_example(args=None):
"""Main script running a single simulation. It returns the detailed power across crossed elements and
average performance accross all channels.
"""
parser = argparse.ArgumentParser(
description='Send a full spectrum load through the network from point A to point B',
epilog=_help_footer,
@@ -126,7 +140,8 @@ def transmission_main_example(args=None):
args = parser.parse_args(args if args is not None else sys.argv[1:])
_setup_logging(args)
(equipment, network) = load_common_data(args.equipment, args.topology, args.sim_params, args.save_network_before_autodesign)
(equipment, network) = load_common_data(args.equipment, args.extra_equipment, args.extra_config, args.topology,
args.sim_params, args.save_network_before_autodesign)
if args.plot:
plot_baseline(network)
@@ -144,19 +159,17 @@ def transmission_main_example(args=None):
sys.exit()
# First try to find exact match if source/destination provided
source = None
if args.source:
source = transceivers.pop(args.source, None)
valid_source = True if source else False
else:
source = None
_logger.info('No source node specified: picking random transceiver')
valid_source = bool(source)
destination = None
nodes_list = []
loose_list = []
if args.destination:
destination = transceivers.pop(args.destination, None)
valid_destination = True if destination else False
else:
destination = None
_logger.info('No destination node specified: picking random transceiver')
valid_destination = bool(destination)
# If no exact match try to find partial match
if args.source and not source:
@@ -173,109 +186,77 @@ def transmission_main_example(args=None):
if not source:
source = list(transceivers.values())[0]
del transceivers[source.uid]
_logger.info('No source node specified: picking random transceiver')
if not destination:
destination = list(transceivers.values())[0]
nodes_list = [destination.uid]
loose_list = ['STRICT']
_logger.info('No destination node specified: picking random transceiver')
_logger.info(f'source = {args.source!r}')
_logger.info(f'destination = {args.destination!r}')
_logger.info(f'source = {source.uid!r}')
_logger.info(f'destination = {destination.uid!r}')
params = {}
params['request_id'] = 0
params['trx_type'] = ''
params['trx_mode'] = ''
params['source'] = source.uid
params['destination'] = destination.uid
params['bidir'] = False
params['nodes_list'] = [destination.uid]
params['loose_list'] = ['strict']
params['format'] = ''
params['path_bandwidth'] = 0
params['effective_freq_slot'] = None
trx_params = trx_mode_params(equipment)
if args.power:
trx_params['power'] = db2lin(float(args.power)) * 1e-3
params.update(trx_params)
initial_spectrum = None
params['nb_channel'] = automatic_nch(trx_params['f_min'], trx_params['f_max'], trx_params['spacing'])
# use ref_req to hold reference channel used for design and req for the propagation
# and req to hold channels to be propagated
# apply power sweep on the design and on the channels
ref_req = PathRequest(**params)
pref_ch_db = watt2dbm(ref_req.power)
if args.spectrum:
# use the spectrum defined by user for the propagation.
# the nb of channel for design remains the one of the reference channel
initial_spectrum = load_initial_spectrum(args.spectrum)
params['nb_channel'] = len(initial_spectrum)
print('User input for spectrum used for propagation instead of SI')
req = PathRequest(**params)
p_ch_db = watt2dbm(req.power)
req.initial_spectrum = initial_spectrum
print(f'There are {req.nb_channel} channels propagating')
power_mode = equipment['Span']['default'].power_mode
print('\n'.join([f'Power mode is set to {power_mode}',
'=> it can be modified in eqpt_config.json - Span']))
if not args.no_insert_edfas:
# Simulate !
try:
add_missing_elements_in_network(network, equipment)
network, req, ref_req = designed_network(equipment, network, source.uid, destination.uid,
nodes_list=nodes_list, loose_list=loose_list,
args_power=args.power,
initial_spectrum=initial_spectrum,
no_insert_edfas=args.no_insert_edfas)
path, propagations_for_path, powers_dbm, infos = transmission_simulation(equipment, network, req, ref_req)
except exceptions.NetworkTopologyError as e:
print(f'{ansi_escapes.red}Invalid network definition:{ansi_escapes.reset} {e}')
sys.exit(1)
except exceptions.ConfigurationError as e:
print(f'{ansi_escapes.red}Configuration error:{ansi_escapes.reset} {e}')
sys.exit(1)
path = compute_constrained_path(network, req)
spans = [s.params.length for s in path if isinstance(s, RamanFiber) or isinstance(s, Fiber)]
power_range = [0]
if power_mode:
# power cannot be changed in gain mode
try:
p_start, p_stop, p_step = equipment['SI']['default'].power_range_db
p_num = abs(int(round((p_stop - p_start) / p_step))) + 1 if p_step != 0 else 1
power_range = list(linspace(p_start, p_stop, p_num))
except TypeError:
print('invalid power range definition in eqpt_config, should be power_range_db: [lower, upper, step]')
# initial network is designed using req.power. that is that any missing information (amp gain or delta_p) is filled
# using this req.power, previous to any sweep requested later on.
try:
design_network(ref_req, network, equipment, set_connector_losses=True, verbose=True)
except exceptions.NetworkTopologyError as e:
print(f'{ansi_escapes.red}Invalid network definition:{ansi_escapes.reset} {e}')
except exceptions.ServiceError as e:
print(f'Service error: {e}')
sys.exit(1)
except exceptions.ConfigurationError as e:
print(f'{ansi_escapes.red}Configuration error:{ansi_escapes.reset} {e}')
except ValueError:
sys.exit(1)
# print or export results
spans = [s.params.length for s in path if isinstance(s, (Fiber, RamanFiber))]
print(f'\nThere are {len(spans)} fiber spans over {sum(spans) / 1000:.0f} km between {source.uid} '
f'and {destination.uid}')
print(f'\nNow propagating between {source.uid} and {destination.uid}:')
for dp_db in power_range:
ref_req.power = dbm2watt(pref_ch_db + dp_db)
req.power = dbm2watt(p_ch_db + dp_db)
design_network(ref_req, network, equipment, set_connector_losses=False, verbose=False)
# 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)
print(f'Reference used for design: (Input optical power reference in span = {watt2dbm(ref_req.power):.2f}dBm,\n'
+ f' spacing = {ref_req.spacing * 1e-9:.2f}GHz\n'
+ f' nb_channels = {ref_req.nb_channel})')
print('\nChannels propagating: (Input optical power deviation in span = '
+ f'{pretty_summary_print(per_label_average(infos.delta_pdb_per_channel, infos.label))}dB,\n'
+ ' spacing = '
+ f'{pretty_summary_print(per_label_average(infos.slot_width * 1e-9, infos.label))}GHz,\n'
+ ' transceiver output power = '
+ f'{pretty_summary_print(per_label_average(watt2dbm(infos.tx_power), infos.label))}dBm,\n'
+ f' nb_channels = {infos.number_of_channels})')
for mypath, power_dbm in zip(propagations_for_path, powers_dbm):
if power_mode:
print(f'\nPropagating with input power = {ansi_escapes.cyan}{watt2dbm(req.power):.2f} '
print(f'Input optical power reference in span = {ansi_escapes.cyan}{power_dbm:.2f} '
+ f'dBm{ansi_escapes.reset}:')
else:
print(f'\nPropagating in {ansi_escapes.cyan}gain mode{ansi_escapes.reset}: power cannot be set manually')
infos = propagate(path, req, equipment)
if len(power_range) == 1:
for elem in path:
print('\nPropagating in {ansi_escapes.cyan}gain mode{ansi_escapes.reset}: power cannot be set manually')
if len(powers_dbm) == 1:
for elem in mypath:
print(elem)
if power_mode:
print(f'\nTransmission result for input power = {lin2db(req.power*1e3):.2f} dBm:')
print(f'\nTransmission result for input optical power reference in span = {power_dbm:.2f} dBm:')
else:
print(f'\nTransmission results:')
print('\nTransmission results:')
print(f' Final GSNR (0.1 nm): {ansi_escapes.cyan}{mean(destination.snr_01nm):.02f} dB{ansi_escapes.reset}')
else:
print(path[-1])
print(mypath[-1])
if args.save_network is not None:
save_network(network, args.save_network)
@@ -323,6 +304,9 @@ def _path_result_json(pathresult):
def path_requests_run(args=None):
"""Main script running several services simulations. It returns a summary of the average performance
for each service.
"""
parser = argparse.ArgumentParser(
description='Compute performance for a list of services provided in a json file or an excel sheet',
epilog=_help_footer,
@@ -336,109 +320,49 @@ def path_requests_run(args=None):
help='considers that all demands are bidir')
parser.add_argument('-o', '--output', type=Path, metavar=_help_fname_json_csv,
help='Store satisifed requests into a JSON or CSV file')
parser.add_argument('--redesign-per-request', action='store_true', help='Redesign the network at each request'
+ ' computation using the request as the reference channel')
args = parser.parse_args(args if args is not None else sys.argv[1:])
_setup_logging(args)
_logger.info(f'Computing path requests {args.service_filename.name} into JSON format')
(equipment, network) = load_common_data(args.equipment, args.topology, args.sim_params, args.save_network_before_autodesign)
(equipment, network) = \
load_common_data(args.equipment, args.extra_equipment, args.extra_config, args.topology, args.sim_params,
args.save_network_before_autodesign)
# Build the network once using the default power defined in SI in eqpt config
# TODO power density: db2linp(ower_dbm": 0)/power_dbm": 0 * nb channels as defined by
# spacing, f_min and f_max
if not args.no_insert_edfas:
try:
add_missing_elements_in_network(network, equipment)
except exceptions.NetworkTopologyError as e:
print(f'{ansi_escapes.red}Invalid network definition:{ansi_escapes.reset} {e}')
sys.exit(1)
except exceptions.ConfigurationError as e:
print(f'{ansi_escapes.red}Configuration error:{ansi_escapes.reset} {e}')
sys.exit(1)
params = {
'request_id': 'reference',
'trx_type': '',
'trx_mode': '',
'source': None,
'destination': None,
'bidir': False,
'nodes_list': [],
'loose_list': [],
'format': '',
'path_bandwidth': 0,
'effective_freq_slot': None,
'nb_channel': automatic_nch(equipment['SI']['default'].f_min, equipment['SI']['default'].f_max,
equipment['SI']['default'].spacing)
}
trx_params = trx_mode_params(equipment)
params.update(trx_params)
reference_channel = PathRequest(**params)
try:
design_network(reference_channel, network, equipment, verbose=True)
except exceptions.NetworkTopologyError as e:
print(f'{ansi_escapes.red}Invalid network definition:{ansi_escapes.reset} {e}')
sys.exit(1)
except exceptions.ConfigurationError as e:
print(f'{ansi_escapes.red}Configuration error:{ansi_escapes.reset} {e}')
sys.exit(1)
if args.save_network is not None:
save_network(network, args.save_network)
print(f'{ansi_escapes.blue}Network (after autodesign) saved to {args.save_network}{ansi_escapes.reset}')
oms_list = build_oms_list(network, equipment)
try:
network, _, _ = designed_network(equipment, network, no_insert_edfas=args.no_insert_edfas)
data = load_requests(args.service_filename, equipment, bidir=args.bidir,
network=network, network_filename=args.topology)
rqs = requests_from_json(data, equipment)
except exceptions.ServiceError as e:
print(f'{ansi_escapes.red}Service error:{ansi_escapes.reset} {e}')
_data = requests_from_json(data, equipment)
_, propagatedpths, reversed_propagatedpths, rqs, dsjn, result = \
planning(network, equipment, data, redesign=args.redesign_per_request)
except exceptions.NetworkTopologyError as e:
print(f'{ansi_escapes.red}Invalid network definition:{ansi_escapes.reset} {e}')
sys.exit(1)
except exceptions.ConfigurationError as e:
print(f'{ansi_escapes.red}Configuration error:{ansi_escapes.reset} {e}')
sys.exit(1)
# check that request ids are unique. Non unique ids, may
# mess the computation: better to stop the computation
all_ids = [r.request_id for r in rqs]
if len(all_ids) != len(set(all_ids)):
for item in list(set(all_ids)):
all_ids.remove(item)
msg = f'Requests id {all_ids} are not unique'
_logger.critical(msg)
sys.exit()
rqs = correct_json_route_list(network, rqs)
# pths = compute_path(network, equipment, rqs)
dsjn = disjunctions_from_json(data)
print(f'{ansi_escapes.blue}List of disjunctions{ansi_escapes.reset}')
print(dsjn)
# need to warn or correct in case of wrong disjunction form
# disjunction must not be repeated with same or different ids
dsjn = deduplicate_disjunctions(dsjn)
# Aggregate demands with same exact constraints
print(f'{ansi_escapes.blue}Aggregating similar requests{ansi_escapes.reset}')
rqs, dsjn = requests_aggregation(rqs, dsjn)
# TODO export novel set of aggregated demands in a json file
print(f'{ansi_escapes.blue}The following services have been requested:{ansi_escapes.reset}')
print(rqs)
print(f'{ansi_escapes.blue}Computing all paths with constraints{ansi_escapes.reset}')
try:
pths = compute_path_dsjctn(network, equipment, rqs, dsjn)
except exceptions.DisjunctionError as this_e:
print(f'{ansi_escapes.red}Disjunction error:{ansi_escapes.reset} {this_e}')
sys.exit(1)
except exceptions.ServiceError as e:
print(f'Service error: {e}')
sys.exit(1)
except ValueError:
sys.exit(1)
print(f'{ansi_escapes.blue}List of disjunctions{ansi_escapes.reset}')
print(dsjn)
print(f'{ansi_escapes.blue}The following services have been requested:{ansi_escapes.reset}')
print(_data)
print(f'{ansi_escapes.blue}Propagating on selected path{ansi_escapes.reset}')
propagatedpths, reversed_pths, reversed_propagatedpths = compute_path_with_disjunction(network, equipment, rqs, pths)
# Note that deepcopy used in compute_path_with_disjunction returns
# a list of nodes which are not belonging to network (they are copies of the node objects).
# so there can not be propagation on these nodes.
pth_assign_spectrum(pths, rqs, oms_list, reversed_pths)
if args.save_network is not None:
save_network(network, args.save_network)
print(f'Network (after autodesign) saved to {args.save_network}')
print(f'{ansi_escapes.blue}Result summary{ansi_escapes.reset}')
header = ['req id', ' demand', ' GSNR@bandwidth A-Z (Z-A)', ' GSNR@0.1nm A-Z (Z-A)',
@@ -459,12 +383,12 @@ def path_requests_run(args=None):
try:
if rqs[i].blocking_reason in BLOCKING_NOPATH:
line = [f'{rqs[i].request_id}', f' {rqs[i].source} to {rqs[i].destination} :',
f'-', f'-', f'-', f'{rqs[i].tsp_mode}', f'{round(rqs[i].path_bandwidth * 1e-9,2)}',
f'-', f'{rqs[i].blocking_reason}']
'-', '-', '-', f'{rqs[i].tsp_mode}', f'{round(rqs[i].path_bandwidth * 1e-9, 2)}',
'-', '{rqs[i].blocking_reason}']
else:
line = [f'{rqs[i].request_id}', f' {rqs[i].source} to {rqs[i].destination} : ', psnrb,
psnr, f'-', f'{rqs[i].tsp_mode}', f'{round(rqs[i].path_bandwidth * 1e-9, 2)}',
f'-', f'{rqs[i].blocking_reason}']
psnr, '-', f'{rqs[i].tsp_mode}', f'{round(rqs[i].path_bandwidth * 1e-9, 2)}',
'-', f'{rqs[i].blocking_reason}']
except AttributeError:
line = [f'{rqs[i].request_id}', f' {rqs[i].source} to {rqs[i].destination} : ', psnrb,
psnr, f'{rqs[i].OSNR + equipment["SI"]["default"].sys_margins}',

View File

@@ -20,7 +20,6 @@ In the "Links" sheet, only the first three columns ("Node A", "Node Z" and
the "east" information so that it is possible to input undirected data.
"""
from xlrd import open_workbook
from logging import getLogger
from argparse import ArgumentParser
from collections import namedtuple, Counter, defaultdict
@@ -28,8 +27,12 @@ from itertools import chain
from json import dumps
from pathlib import Path
from copy import copy
from typing import Dict, List, Tuple, DefaultDict
from xlrd import open_workbook
from xlrd.biffh import XLRDError
from networkx import DiGraph
from gnpy.core.utils import silent_remove
from gnpy.core.utils import silent_remove, transform_data
from gnpy.core.exceptions import NetworkTopologyError
from gnpy.core.elements import Edfa, Fused, Fiber
@@ -38,12 +41,16 @@ _logger = getLogger(__name__)
def all_rows(sh, start=0):
"""Returns all rows of the xls(x) sheet starting from start row
"""
return (sh.row(x) for x in range(start, sh.nrows))
class Node(object):
class Node:
"""Node data class
"""
def __init__(self, **kwargs):
super(Node, self).__init__()
super().__init__()
self.update_attr(kwargs)
def update_attr(self, kwargs):
@@ -65,13 +72,13 @@ class Node(object):
}
class Link(object):
class Link:
"""attribtes from west parse_ept_headers dict
+node_a, node_z, west_fiber_con_in, east_fiber_con_in
"""
def __init__(self, **kwargs):
super(Link, self).__init__()
super().__init__()
self.update_attr(kwargs)
self.distance_units = 'km'
@@ -80,7 +87,7 @@ class Link(object):
for k, v in self.default_values.items():
v = clean_kwargs.get(k, v)
setattr(self, k, v)
k = 'west' + k.split('east')[-1]
k = 'west' + k.rsplit('east', maxsplit=1)[-1]
v = clean_kwargs.get(k, v)
setattr(self, k, v)
@@ -101,9 +108,11 @@ class Link(object):
}
class Eqpt(object):
class Eqpt:
"""
"""
def __init__(self, **kwargs):
super(Eqpt, self).__init__()
super().__init__()
self.update_attr(kwargs)
def update_attr(self, kwargs):
@@ -111,7 +120,7 @@ class Eqpt(object):
for k, v in self.default_values.items():
v_east = clean_kwargs.get(k, v)
setattr(self, k, v_east)
k = 'west' + k.split('east')[-1]
k = 'west' + k.rsplit('east', maxsplit=1)[-1]
v_west = clean_kwargs.get(k, v)
setattr(self, k, v_west)
@@ -119,17 +128,18 @@ class Eqpt(object):
'from_city': '',
'to_city': '',
'east_amp_type': '',
'east_att_in': 0,
'east_amp_gain': None,
'east_amp_dp': None,
'east_tilt': 0,
'east_tilt_vs_wavelength': None,
'east_att_out': None
}
class Roadm(object):
class Roadm:
"""
"""
def __init__(self, **kwargs):
super(Roadm, self).__init__()
super().__init__()
self.update_attr(kwargs)
def update_attr(self, kwargs):
@@ -140,7 +150,10 @@ class Roadm(object):
default_values = {'from_node': '',
'to_node': '',
'target_pch_out_db': None
'target_pch_out_db': None,
'type_variety': None,
'from_degrees': None,
'impairment_ids': None
}
@@ -153,7 +166,7 @@ def read_header(my_sheet, line, slice_):
try:
header = [x.value.strip() for x in my_sheet.row_slice(line, slice_[0], slice_[1])]
header_i = [Param_header(header, i + slice_[0]) for i, header in enumerate(header) if header != '']
except Exception:
except (AttributeError, IndexError):
header_i = []
if header_i != [] and header_i[-1].colindex != slice_[1]:
header_i.append(Param_header('', slice_[1]))
@@ -169,7 +182,7 @@ def read_slice(my_sheet, line, slice_, header):
try:
slice_range = next((h.colindex, header_i[i + 1].colindex)
for i, h in enumerate(header_i) if header in h.header)
except Exception:
except StopIteration:
pass
return slice_range
@@ -190,7 +203,6 @@ def parse_headers(my_sheet, input_headers_dict, headers, start_line, slice_in):
msg = f'missing header {h0}'
if h0 in ('east', 'Node A', 'Node Z', 'City'):
raise NetworkTopologyError(msg)
else:
_logger.warning(msg)
elif not isinstance(input_headers_dict[h0], dict):
headers[slice_out[0]] = input_headers_dict[h0]
@@ -203,22 +215,33 @@ def parse_headers(my_sheet, input_headers_dict, headers, start_line, slice_in):
def parse_row(row, headers):
"""
"""
return {f: r.value for f, r in
zip([label for label in headers.values()], [row[i] for i in headers])}
zip(list(headers.values()), [row[i] for i in headers])}
def parse_sheet(my_sheet, input_headers_dict, header_line, start_line, column):
"""
"""
headers = parse_headers(my_sheet, input_headers_dict, {}, header_line, (0, column))
for row in all_rows(my_sheet, start=start_line):
yield parse_row(row[0: column], headers)
def _format_items(items):
def _format_items(items: List[str]):
"""formating utils
"""
return '\n'.join(f' - {item}' for item in items)
def sanity_check(nodes, links, nodes_by_city, links_by_city, eqpts_by_city):
def sanity_check(nodes: List[Node], links: List[Link],
nodes_by_city: Dict[str, Node], links_by_city: DefaultDict[str, List[Link]],
eqpts_by_city: DefaultDict[str, List[Eqpt]]) -> Tuple[List[Node], List[Link]]:
"""Raise correct issues if xls(x) is not correct, Correct type to ROADM if more tha 2-degrees
checks duplicate links, unreferenced nodes in links, in eqpts, unreferenced link in eqpts,
duplicate items
"""
duplicate_links = []
for l1 in links:
for l2 in links:
@@ -227,6 +250,7 @@ def sanity_check(nodes, links, nodes_by_city, links_by_city, eqpts_by_city):
link {l1.from_city}-{l1.to_city} is duplicate \
\nthe 1st duplicate link will be removed but you should check Links sheet input')
duplicate_links.append(l1)
if duplicate_links:
msg = 'XLS error: ' \
+ f'links {_format_items([(d.from_city, d.to_city) for d in duplicate_links])} are duplicate'
@@ -315,13 +339,29 @@ def create_roadm_element(node, roadms_by_city):
'booster_variety_list': silent_remove(node.booster_restriction.split(' | '), '')}
}
if node.city in roadms_by_city.keys():
if 'params' not in roadm.keys():
if 'params' not in roadm:
roadm['params'] = {}
roadm['params']['per_degree_pch_out_db'] = {}
for elem in roadms_by_city[node.city]:
to_node = f'east edfa in {node.city} to {elem.to_node}'
if elem.target_pch_out_db is not None:
roadm['params']['per_degree_pch_out_db'][to_node] = elem.target_pch_out_db
if elem.from_degrees is not None and elem.impairment_ids is not None:
# only set per degree impairment if there is an entry (reduce verbose)
if roadm['params'].get('per_degree_impairments') is None:
roadm['params']['per_degree_impairments'] = []
fromdegrees = elem.from_degrees.split(' | ')
impairment_ids = transform_data(elem.impairment_ids)
if len(fromdegrees) != len(impairment_ids):
msg = f'Roadm {node.city} per degree impairment id do not match with from degree definition'
raise NetworkTopologyError(msg)
for from_degree, impairment_id in zip(fromdegrees, impairment_ids):
from_node = f'west edfa in {node.city} to {from_degree}'
roadm['params']['per_degree_impairments'].append({'from_degree': from_node,
'to_degree': to_node,
'impairment_id': impairment_id})
if elem.type_variety is not None:
roadm['type_variety'] = elem.type_variety
roadm['metadata'] = {'location': {'city': node.city,
'region': node.region,
'latitude': node.latitude,
@@ -330,7 +370,7 @@ def create_roadm_element(node, roadms_by_city):
return roadm
def create_east_eqpt_element(node):
def create_east_eqpt_element(node: Node, nodes_by_city: Dict[str, Node]) -> dict:
""" create amplifiers json elements for the east direction.
this includes the case where the case of a fused element defined instead of an
ILA in eqpt sheet
@@ -345,13 +385,13 @@ def create_east_eqpt_element(node):
eqpt['type_variety'] = f'{node.east_amp_type}'
eqpt['operational'] = {'gain_target': node.east_amp_gain,
'delta_p': node.east_amp_dp,
'tilt_target': node.east_tilt,
'tilt_target': node.east_tilt_vs_wavelength,
'out_voa': node.east_att_out}
elif node.east_amp_type.lower() == '':
eqpt['type'] = 'Edfa'
eqpt['operational'] = {'gain_target': node.east_amp_gain,
'delta_p': node.east_amp_dp,
'tilt_target': node.east_tilt,
'tilt_target': node.east_tilt_vs_wavelength,
'out_voa': node.east_att_out}
elif node.east_amp_type.lower() == 'fused':
# fused edfa variety is a hack to indicate that there should not be
@@ -363,7 +403,7 @@ def create_east_eqpt_element(node):
return eqpt
def create_west_eqpt_element(node):
def create_west_eqpt_element(node: Node, nodes_by_city: Dict[str, Node]) -> dict:
""" create amplifiers json elements for the west direction.
this includes the case where the case of a fused element defined instead of an
ILA in eqpt sheet
@@ -378,19 +418,25 @@ def create_west_eqpt_element(node):
eqpt['type_variety'] = f'{node.west_amp_type}'
eqpt['operational'] = {'gain_target': node.west_amp_gain,
'delta_p': node.west_amp_dp,
'tilt_target': node.west_tilt,
'tilt_target': node.west_tilt_vs_wavelength,
'out_voa': node.west_att_out}
elif node.west_amp_type.lower() == '':
eqpt['operational'] = {'gain_target': node.west_amp_gain,
'delta_p': node.west_amp_dp,
'tilt_target': node.west_tilt,
'tilt_target': node.west_tilt_vs_wavelength,
'out_voa': node.west_att_out}
elif node.west_amp_type.lower() == 'fused':
eqpt['type'] = 'Fused'
eqpt['params'] = {'loss': 0}
return eqpt
def xls_to_json_data(input_filename, filter_region=[]):
def xls_to_json_data(input_filename: Path, filter_region: List[str] = None) -> Dict:
"""Read the excel sheets and produces the json dict in GNPy format (legacy)
returns json dict
"""
if filter_region is None:
filter_region = []
nodes, links, eqpts, roadms = parse_excel(input_filename)
if filter_region:
nodes = [n for n in nodes if n.region.lower() in filter_region]
@@ -400,16 +446,13 @@ def xls_to_json_data(input_filename, filter_region=[]):
cities = {lnk.from_city for lnk in links} | {lnk.to_city for lnk in links}
nodes = [n for n in nodes if n.city in cities]
global nodes_by_city
nodes_by_city = {n.city: n for n in nodes}
global links_by_city
links_by_city = defaultdict(list)
for link in links:
links_by_city[link.from_city].append(link)
links_by_city[link.to_city].append(link)
global eqpts_by_city
eqpts_by_city = defaultdict(list)
for eqpt in eqpts:
eqpts_by_city[eqpt.from_city].append(eqpt)
@@ -475,7 +518,7 @@ def xls_to_json_data(input_filename, filter_region=[]):
'longitude': x.longitude}},
'type': 'Edfa',
'operational': {'gain_target': None,
'tilt_target': 0}
'tilt_target': None}
} for x in nodes_by_city.values() if x.node_type.lower() == 'ila' and x.city not in eqpts_by_city] +
[{'uid': f'east edfa in {x.city}',
'metadata': {'location': {'city': x.city,
@@ -484,25 +527,26 @@ def xls_to_json_data(input_filename, filter_region=[]):
'longitude': x.longitude}},
'type': 'Edfa',
'operational': {'gain_target': None,
'tilt_target': 0}
} for x in nodes_by_city.values() if x.node_type.lower() == 'ila' and x.city not in eqpts_by_city] +
[create_east_eqpt_element(e) for e in eqpts] +
[create_west_eqpt_element(e) for e in eqpts],
'tilt_target': None}
} for x in nodes_by_city.values() if x.node_type.lower() == 'ila' and x.city not in eqpts_by_city]
+ [create_east_eqpt_element(e, nodes_by_city) for e in eqpts]
+ [create_west_eqpt_element(e, nodes_by_city) for e in eqpts],
'connections':
list(chain.from_iterable([eqpt_connection_by_city(n.city)
list(chain.from_iterable([eqpt_connection_by_city(n.city, eqpts_by_city, links_by_city, nodes_by_city)
for n in nodes]))
+
list(chain.from_iterable(zip(
[{'from_node': f'trx {x.city}',
'to_node': f'roadm {x.city}'}
+ list(chain.from_iterable(zip(
[{'from_node': f'trx {x.city}', 'to_node': f'roadm {x.city}'}
for x in nodes_by_city.values() if x.node_type.lower() == 'roadm'],
[{'from_node': f'roadm {x.city}',
'to_node': f'trx {x.city}'}
[{'from_node': f'roadm {x.city}', 'to_node': f'trx {x.city}'}
for x in nodes_by_city.values() if x.node_type.lower() == 'roadm'])))
}
def convert_file(input_filename, filter_region=[], output_json_file_name=None):
def convert_file(input_filename: Path, filter_region: List[str] = None, output_json_file_name: Path = None):
"""Save the conversion into
"""
if filter_region is None:
filter_region = []
data = xls_to_json_data(input_filename, filter_region)
if output_json_file_name is None:
output_json_file_name = input_filename.with_suffix('.json')
@@ -512,79 +556,77 @@ def convert_file(input_filename, filter_region=[], output_json_file_name=None):
return output_json_file_name
def corresp_names(input_filename, network):
def corresp_names(input_filename: Path, network: DiGraph):
""" a function that builds the correspondance between names given in the excel,
and names used in the json, and created by the autodesign.
All names are listed
"""
nodes, links, eqpts, roadms = parse_excel(input_filename)
nodes, links, eqpts, _ = parse_excel(input_filename)
fused = [n.uid for n in network.nodes() if isinstance(n, Fused)]
ila = [n.uid for n in network.nodes() if isinstance(n, Edfa)]
corresp_roadm = {x.city: [f'roadm {x.city}'] for x in nodes
if x.node_type.lower() == 'roadm'}
corresp_fused = {x.city: [f'west fused spans in {x.city}', f'east fused spans in {x.city}']
for x in nodes if x.node_type.lower() == 'fused' and
f'west fused spans in {x.city}' in fused and
f'east fused spans in {x.city}' in fused}
for x in nodes if x.node_type.lower() == 'fused'
and f'west fused spans in {x.city}' in fused
and f'east fused spans in {x.city}' in fused}
corresp_ila = defaultdict(list)
# add the special cases when an ila is changed into a fused
for my_e in eqpts:
name = f'east edfa in {my_e.from_city} to {my_e.to_city}'
if my_e.east_amp_type.lower() == 'fused' and name in fused:
if my_e.from_city in corresp_fused.keys():
corresp_fused[my_e.from_city].append(name)
else:
corresp_fused[my_e.from_city] = [name]
corresp_fused.get(my_e.from_city, []).append(name)
name = f'west edfa in {my_e.from_city} to {my_e.to_city}'
if my_e.west_amp_type.lower() == 'fused' and name in fused:
if my_e.from_city in corresp_fused.keys():
corresp_fused[my_e.from_city].append(name)
else:
corresp_fused[my_e.from_city] = [name]
corresp_fused.get(my_e.from_city, []).append(name)
# build corresp ila based on eqpt sheet
# start with east direction
corresp_ila = {e.from_city: [f'east edfa in {e.from_city} to {e.to_city}']
for e in eqpts if f'east edfa in {e.from_city} to {e.to_city}' in ila}
# west direction, append name or create a new item in dict
for my_e in eqpts:
name = f'west edfa in {my_e.from_city} to {my_e.to_city}'
for name in [f'east edfa in {my_e.from_city} to {my_e.to_city}',
f'west edfa in {my_e.from_city} to {my_e.to_city}']:
if name in ila:
if my_e.from_city in corresp_ila.keys():
corresp_ila[my_e.from_city].append(name)
else:
corresp_ila[my_e.from_city] = [name]
# complete with potential autodesign names: amplifiers
for my_l in links:
name = f'Edfa0_fiber ({my_l.to_city} \u2192 {my_l.from_city})-{my_l.west_cable}'
# create names whatever the type and filter them out
# from-to direction
names = [f'Edfa_preamp_roadm {my_l.from_city}_from_fiber ({my_l.to_city} \u2192 {my_l.from_city})-{my_l.west_cable}',
f'Edfa_booster_roadm {my_l.from_city}_to_fiber ({my_l.from_city} \u2192 {my_l.to_city})-{my_l.east_cable}']
for name in names:
if name in ila:
if my_l.from_city in corresp_ila.keys():
# "east edfa in Stbrieuc to Rennes_STA" is equivalent name as
# "Edfa0_fiber (Lannion_CAS → Stbrieuc)-F056"
# "Edfa_booster_roadm Stbrieuc_to_fiber (Lannion_CAS → Stbrieuc)-F056"
# "west edfa in Stbrieuc to Rennes_STA" is equivalent name as
# "Edfa0_fiber (Rennes_STA → Stbrieuc)-F057"
# does not filter names: all types (except boosters) are created.
# in case fibers are splitted the name here is a prefix
# "Edfa_preamp_roadm Stbrieuc_to_fiber (Rennes_STA → Stbrieuc)-F057"
# in case fibers are splitted the name here is a
corresp_ila[my_l.from_city].append(name)
else:
corresp_ila[my_l.from_city] = [name]
name = f'Edfa0_fiber ({my_l.from_city} \u2192 {my_l.to_city})-{my_l.east_cable}'
# to-from direction
names = [f'Edfa_preamp_roadm {my_l.to_city}_from_fiber ({my_l.from_city} \u2192 {my_l.to_city})-{my_l.east_cable}',
f'Edfa_booster_roadm {my_l.to_city}_to_fiber ({my_l.to_city} \u2192 {my_l.from_city})-{my_l.west_cable}']
for name in names:
if name in ila:
if my_l.to_city in corresp_ila.keys():
corresp_ila[my_l.to_city].append(name)
else:
corresp_ila[my_l.to_city] = [name]
for node in nodes:
names = [f'east edfa in {node.city}', f'west edfa in {node.city}']
for name in names:
if name in ila:
# "east edfa in Stbrieuc to Rennes_STA" (created with Eqpt) is equivalent name as
# "east edfa in Stbrieuc" or "west edfa in Stbrieuc" (created with Links sheet)
# depending on link node order
corresp_ila[node.city].append(name)
# merge fused with ila:
for key, val in corresp_fused.items():
if key in corresp_ila.keys():
corresp_ila[key].extend(val)
else:
corresp_ila[key] = val
# no need of roadm booster
return corresp_roadm, corresp_fused, corresp_ila
def parse_excel(input_filename):
def parse_excel(input_filename: Path) -> Tuple[List[Node], List[Link], List[Eqpt], List[Roadm]]:
"""reads xls(x) sheets among Nodes, Eqpts, Links, Roadms and parse the data in the sheets
into internal data structure Node, Link, Eqpt, Roadm, classes
"""
link_headers = {
'Node A': 'from_city',
'Node Z': 'to_city',
@@ -623,7 +665,6 @@ def parse_excel(input_filename):
'Node Z': 'to_city',
'east': {
'amp type': 'east_amp_type',
'att_in': 'east_att_in',
'amp gain': 'east_amp_gain',
'delta p': 'east_amp_dp',
'tilt': 'east_tilt',
@@ -631,7 +672,6 @@ def parse_excel(input_filename):
},
'west': {
'amp type': 'west_amp_type',
'att_in': 'west_att_in',
'amp gain': 'west_amp_gain',
'delta p': 'west_amp_dp',
'tilt': 'west_tilt',
@@ -640,7 +680,10 @@ def parse_excel(input_filename):
}
roadm_headers = {'Node A': 'from_node',
'Node Z': 'to_node',
'per degree target power (dBm)': 'target_pch_out_db'
'per degree target power (dBm)': 'target_pch_out_db',
'type_variety': 'type_variety',
'from degrees': 'from_degrees',
'from degree to degree impairment id': 'impairment_ids'
}
with open_workbook(input_filename) as wb:
@@ -648,36 +691,32 @@ def parse_excel(input_filename):
links_sheet = wb.sheet_by_name('Links')
try:
eqpt_sheet = wb.sheet_by_name('Eqpt')
except Exception:
except XLRDError:
# eqpt_sheet is optional
eqpt_sheet = None
try:
roadm_sheet = wb.sheet_by_name('Roadms')
except Exception:
except XLRDError:
# roadm_sheet is optional
roadm_sheet = None
nodes = []
for node in parse_sheet(nodes_sheet, node_headers, NODES_LINE, NODES_LINE + 1, NODES_COLUMN):
nodes.append(Node(**node))
nodes = [Node(**node) for node in parse_sheet(nodes_sheet, node_headers,
NODES_LINE, NODES_LINE + 1, NODES_COLUMN)]
expected_node_types = {'ROADM', 'ILA', 'FUSED'}
for n in nodes:
if n.node_type not in expected_node_types:
n.node_type = 'ILA'
links = []
for link in parse_sheet(links_sheet, link_headers, LINKS_LINE, LINKS_LINE + 2, LINKS_COLUMN):
links.append(Link(**link))
links = [Link(**link) for link in parse_sheet(links_sheet, link_headers,
LINKS_LINE, LINKS_LINE + 2, LINKS_COLUMN)]
eqpts = []
if eqpt_sheet is not None:
for eqpt in parse_sheet(eqpt_sheet, eqpt_headers, EQPTS_LINE, EQPTS_LINE + 2, EQPTS_COLUMN):
eqpts.append(Eqpt(**eqpt))
eqpts = [Eqpt(**eqpt) for eqpt in parse_sheet(eqpt_sheet, eqpt_headers,
EQPTS_LINE, EQPTS_LINE + 2, EQPTS_COLUMN)]
roadms = []
if roadm_sheet is not None:
for roadm in parse_sheet(roadm_sheet, roadm_headers, ROADMS_LINE, ROADMS_LINE+2, ROADMS_COLUMN):
roadms.append(Roadm(**roadm))
roadms = [Roadm(**roadm) for roadm in parse_sheet(roadm_sheet, roadm_headers,
ROADMS_LINE, ROADMS_LINE + 2, ROADMS_COLUMN)]
# sanity check
all_cities = Counter(n.city for n in nodes)
@@ -699,32 +738,37 @@ def parse_excel(input_filename):
return nodes, links, eqpts, roadms
def eqpt_connection_by_city(city_name):
other_cities = fiber_dest_from_source(city_name)
def eqpt_connection_by_city(city_name: str, eqpts_by_city: DefaultDict[str, List[Eqpt]],
links_by_city: DefaultDict[str, List[Link]], nodes_by_city: Dict[str, Node]) -> list:
"""
"""
other_cities = fiber_dest_from_source(city_name, links_by_city)
subdata = []
if nodes_by_city[city_name].node_type.lower() in {'ila', 'fused'}:
# Then len(other_cities) == 2
direction = ['west', 'east']
for i in range(2):
from_ = fiber_link(other_cities[i], city_name)
in_ = eqpt_in_city_to_city(city_name, other_cities[0], direction[i])
to_ = fiber_link(city_name, other_cities[1 - i])
from_ = fiber_link(other_cities[i], city_name, links_by_city)
in_ = eqpt_in_city_to_city(city_name, other_cities[0], eqpts_by_city, nodes_by_city, direction[i])
to_ = fiber_link(city_name, other_cities[1 - i], links_by_city)
subdata += connect_eqpt(from_, in_, to_)
elif nodes_by_city[city_name].node_type.lower() == 'roadm':
for other_city in other_cities:
from_ = f'roadm {city_name}'
in_ = eqpt_in_city_to_city(city_name, other_city)
to_ = fiber_link(city_name, other_city)
in_ = eqpt_in_city_to_city(city_name, other_city, eqpts_by_city, nodes_by_city)
to_ = fiber_link(city_name, other_city, links_by_city)
subdata += connect_eqpt(from_, in_, to_)
from_ = fiber_link(other_city, city_name)
in_ = eqpt_in_city_to_city(city_name, other_city, "west")
from_ = fiber_link(other_city, city_name, links_by_city)
in_ = eqpt_in_city_to_city(city_name, other_city, eqpts_by_city, nodes_by_city, "west")
to_ = f'roadm {city_name}'
subdata += connect_eqpt(from_, in_, to_)
return subdata
def connect_eqpt(from_, in_, to_):
def connect_eqpt(from_: str, in_: str, to_: str) -> List[dict]:
"""Utils: create the topology connection json dict between in and to
"""
connections = []
if in_ != '':
connections = [{'from_node': from_, 'to_node': in_},
@@ -734,7 +778,11 @@ def connect_eqpt(from_, in_, to_):
return connections
def eqpt_in_city_to_city(in_city, to_city, direction='east'):
def eqpt_in_city_to_city(in_city: str, to_city: str,
eqpts_by_city: DefaultDict[str, List[Eqpt]], nodes_by_city: Dict[str, Node],
direction: str = 'east') -> str:
"""Utils: returns the formatted dtring corresponding to in_city types and direction
"""
rev_direction = 'west' if direction == 'east' else 'east'
return_eqpt = ''
if in_city in eqpts_by_city:
@@ -753,22 +801,25 @@ def eqpt_in_city_to_city(in_city, to_city, direction='east'):
return return_eqpt
def corresp_next_node(network, corresp_ila, corresp_roadm):
def corresp_next_node(network: DiGraph, corresp_ila: dict, corresp_roadm: dict) -> Tuple[dict, dict]:
""" for each name in corresp dictionnaries find the next node in network and its name
given by user in excel. for meshTopology_exampleV2.xls:
user ILA name Stbrieuc covers the two direction. convert.py creates 2 different ILA
with possible names (depending on the direction and if the eqpt was defined in eqpt
sheet)
for an ILA and if it is defined in eqpt:
- east edfa in Stbrieuc to Rennes_STA
- west edfa in Stbrieuc to Rennes_STA
- Edfa0_fiber (Lannion_CAS → Stbrieuc)-F056
- Edfa0_fiber (Rennes_STA → Stbrieuc)-F057
for an ILA and if it is not defined in eqpt:
- east edfa in Stbrieuc
- west edfa in Stbrieuc
for a roadm
"Edfa_preamp_roadm node1_from_fiber (siteE → node1)-CABLES#19"
"Edfa_booster_roadm node1_to_fiber (node1 → siteE)-CABLES#19"
next_nodes finds the user defined name of next node to be able to map the path constraints
- east edfa in Stbrieuc to Rennes_STA next node = Rennes_STA
- west edfa in Stbrieuc to Rennes_STA next node Lannion_CAS
Edfa0_fiber (Lannion_CAS → Stbrieuc)-F056 and Edfa0_fiber (Rennes_STA → Stbrieuc)-F057
do not exist
the function supports fiber splitting, fused nodes and shall only be called if
excel format is used for both network and service
"""
@@ -779,8 +830,8 @@ def corresp_next_node(network, corresp_ila, corresp_roadm):
for ila_elem in ila_list:
# find the node with ila_elem string _in_ the node uid. 'in' is used instead of
# '==' to find composed nodes due to fiber splitting in autodesign.
# eg if elem_ila is 'Edfa0_fiber (Lannion_CAS → Stbrieuc)-F056',
# node uid 'Edfa0_fiber (Lannion_CAS → Stbrieuc)-F056_(1/2)' is possible
# eg if elem_ila is 'east edfa in Stbrieuc to Rennes_STA',
# node uid 'east edfa in Stbrieuc to Rennes_STA-_(1/2)' is possible
correct_ila_name = next(n.uid for n in network.nodes() if ila_elem in n.uid)
temp.remove(ila_elem)
temp.append(correct_ila_name)
@@ -797,7 +848,7 @@ def corresp_next_node(network, corresp_ila, corresp_roadm):
break
# if next_nd was not already added in the dict with the previous loop,
# add the first found correspondance in ila names
if correct_ila_name not in next_node.keys():
if correct_ila_name not in next_node:
for key, val in corresp_ila.items():
# in case of splitted fibers the ila name might not be exact match
if [e for e in val if e in next_nd.uid]:
@@ -808,7 +859,9 @@ def corresp_next_node(network, corresp_ila, corresp_roadm):
return corresp_ila, next_node
def fiber_dest_from_source(city_name):
def fiber_dest_from_source(city_name: str, links_by_city: DefaultDict[str, List[Link]]) -> List[str]:
"""Returns the list of cities city_name is connected to
"""
destinations = []
links_from_city = links_by_city[city_name]
for l in links_from_city:
@@ -819,7 +872,9 @@ def fiber_dest_from_source(city_name):
return destinations
def fiber_link(from_city, to_city):
def fiber_link(from_city: str, to_city: str, links_by_city: DefaultDict[str, List[Link]]) -> str:
"""utils: returns formatted uid for fibers between from_city and to_city
"""
source_dest = (from_city, to_city)
links = links_by_city[from_city]
link = next(l for l in links if l.from_city in source_dest and l.to_city in source_dest)
@@ -830,7 +885,9 @@ def fiber_link(from_city, to_city):
return fiber
def midpoint(city_a, city_b):
def midpoint(city_a: Node, city_b:Node) -> dict:
"""Computes mipoint coordinates
"""
lats = city_a.latitude, city_b.latitude
longs = city_a.longitude, city_b.longitude
try:
@@ -855,10 +912,12 @@ LINKS_LINE = 3
EQPTS_LINE = 3
EQPTS_COLUMN = 14
ROADMS_LINE = 3
ROADMS_COLUMN = 3
ROADMS_COLUMN = 6
def _do_convert():
"""Main function for xls(x) topology conversion to JSON format
"""
parser = ArgumentParser()
parser.add_argument('workbook', type=Path)
parser.add_argument('-f', '--filter-region', action='append', default=[])

View File

@@ -8,20 +8,23 @@ gnpy.tools.json_io
Loading and saving data from JSON files in GNPy's internal data format
"""
from networkx import DiGraph
from logging import getLogger
from pathlib import Path
import json
from collections import namedtuple
from copy import deepcopy
from typing import Union, Dict, List
from networkx import DiGraph
from numpy import arange
from gnpy.core import elements
from gnpy.core.equipment import trx_mode_params
from gnpy.core.equipment import trx_mode_params, find_type_variety
from gnpy.core.exceptions import ConfigurationError, EquipmentConfigError, NetworkTopologyError, ServiceError
from gnpy.core.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.core.parameters import DEFAULT_RAMAN_COEFFICIENT
from gnpy.core.utils import automatic_nch, automatic_fmax, merge_amplifier_restrictions, dbm2watt
from gnpy.core.parameters import DEFAULT_RAMAN_COEFFICIENT, EdfaParams, MultiBandParams, DEFAULT_EDFA_CONFIG
from gnpy.topology.request import PathRequest, Disjunction, compute_spectrum_slot_vs_bandwidth
from gnpy.topology.spectrum_assignment import mvalue_to_slots
from gnpy.tools.convert import xls_to_json_data
@@ -36,28 +39,41 @@ Model_fg = namedtuple('Model_fg', 'nf0')
Model_openroadm_ila = namedtuple('Model_openroadm_ila', 'nf_coef')
Model_hybrid = namedtuple('Model_hybrid', 'nf_ram gain_ram edfa_variety')
Model_dual_stage = namedtuple('Model_dual_stage', 'preamp_variety booster_variety')
_examples_dir = Path(__file__).parent.parent / 'example-data'
DEFAULT_EXTRA_CONFIG = {"std_medium_gain_advanced_config.json": _examples_dir / "std_medium_gain_advanced_config.json",
"Juniper-BoosterHG.json": _examples_dir / "Juniper-BoosterHG.json"}
DEFAULT_EQPT_CONFIG = _examples_dir / "eqpt_config.json"
class Model_openroadm_preamp:
pass
"""class to hold nf model specific to OpenROADM preamp
"""
class Model_openroadm_booster:
pass
"""class to hold nf model specific to OpenROADM booster
"""
class _JsonThing:
"""Base class for json equipment
"""
def update_attr(self, default_values, kwargs, name):
"""Build the attributes based on kwargs dict
"""
clean_kwargs = {k: v for k, v in kwargs.items() if v != ''}
for k, v in default_values.items():
setattr(self, k, clean_kwargs.get(k, v))
if k not in clean_kwargs and name != 'Amp':
msg = f'\n WARNING missing {k} attribute in eqpt_config.json[{name}]' \
+ f'\n default value is {k} = {v}'
if k not in clean_kwargs and name != 'Amp' and v is not None and v != []:
# do not show this warning if the default value is None
msg = f'\n\tWARNING missing {k} attribute in eqpt_config.json[{name}]' \
+ f'\n\tdefault value is {k} = {v}\n'
_logger.warning(msg)
class SI(_JsonThing):
"""Spectrum Information
"""
default_values = {
"f_min": 191.35e12,
"f_max": 196.1e12,
@@ -67,7 +83,8 @@ class SI(_JsonThing):
"power_range_db": [0, 0, 0.5],
"roll_off": 0.15,
"tx_osnr": 45,
"sys_margins": 0
"sys_margins": 0,
"tx_power_dbm": None # optional value in SI
}
def __init__(self, **kwargs):
@@ -75,6 +92,8 @@ class SI(_JsonThing):
class Span(_JsonThing):
"""Span simulations definition
"""
default_values = {
'power_mode': True,
'delta_power_range_db': None,
@@ -94,14 +113,18 @@ class Span(_JsonThing):
class Roadm(_JsonThing):
"""List of ROADM and their specs
"""
default_values = {
'type_variety': 'default',
'add_drop_osnr': 100,
'pmd': 0,
'pdl': 0,
'restrictions': {
'preamp_variety_list': [],
'booster_variety_list': []
}
},
'roadm-path-impairments': []
}
def __init__(self, **kwargs):
@@ -124,6 +147,8 @@ class Roadm(_JsonThing):
class Transceiver(_JsonThing):
"""List of transceivers and their modes
"""
default_values = {
'type_variety': None,
'frequency': None,
@@ -156,6 +181,8 @@ class Transceiver(_JsonThing):
class Fiber(_JsonThing):
"""Fiber default settings
"""
default_values = {
'type_variety': '',
'dispersion': None,
@@ -176,58 +203,42 @@ class Fiber(_JsonThing):
class RamanFiber(Fiber):
pass
"""Raman Fiber default settings
"""
class Amp(_JsonThing):
default_values = {
'f_min': 191.35e12,
'f_max': 196.1e12,
'type_variety': '',
'type_def': '',
'gain_flatmax': None,
'gain_min': None,
'p_max': None,
'nf_model': None,
'dual_stage_model': None,
'preamp_variety': None,
'booster_variety': None,
'nf_min': None,
'nf_max': None,
'nf_coef': None,
'nf0': None,
'nf_fit_coeff': None,
'nf_ripple': 0,
'dgt': None,
'gain_ripple': 0,
'tilt_ripple': 0,
'f_ripple_ref': None,
'out_voa_auto': False,
'allowed_for_design': False,
'raman': False,
'pmd': 0,
'pdl': 0,
'advance_configurations_from_json': None
}
"""List of amplifiers with their specs
"""
default_values = EdfaParams.default_values
def __init__(self, **kwargs):
self.update_attr(self.default_values, kwargs, 'Amp')
@classmethod
def from_json(cls, filename, **kwargs):
config = Path(filename).parent / 'default_edfa_config.json'
def from_json(cls, extra_configs, **kwargs):
"""
"""
# default EDFA DGT and ripples are defined in parameters DEFAULT_EDFA_CONFIG. copy these values when
# creating a new amplifier
config = {k: v for k, v in DEFAULT_EDFA_CONFIG.items()}
config_filename = 'default' # default value to display in case of error
type_variety = kwargs['type_variety']
type_def = kwargs.get('type_def', 'variable_gain') # default compatibility with older json eqpt files
nf_def = None
dual_stage_def = None
amplifiers = None
if type_def == 'fixed_gain':
if 'default_config_from_json' in kwargs:
# use user defined default instead of DEFAULT_EDFA_CONFIG
config_filename = extra_configs[kwargs.pop('default_config_from_json')]
config = load_json(config_filename)
try:
nf0 = kwargs.pop('nf0')
except KeyError: # nf0 is expected for a fixed gain amp
except KeyError as exc: # nf0 is expected for a fixed gain amp
msg = f'missing nf0 value input for amplifier: {type_variety} in equipment config'
raise EquipmentConfigError(msg)
raise EquipmentConfigError(msg) from exc
for k in ('nf_min', 'nf_max'):
try:
del kwargs[k]
@@ -235,15 +246,21 @@ class Amp(_JsonThing):
pass
nf_def = Model_fg(nf0)
elif type_def == 'advanced_model':
config = Path(filename).parent / kwargs.pop('advanced_config_from_json')
# use the user file name define in library instead of default config
config_filename = extra_configs[kwargs.pop('advanced_config_from_json')]
config = load_json(config_filename)
elif type_def == 'variable_gain':
if 'default_config_from_json' in kwargs:
# use user defined default instead of DEFAULT_EDFA_CONFIG
config_filename = extra_configs[kwargs.pop('default_config_from_json')]
config = load_json(config_filename)
gain_min, gain_max = kwargs['gain_min'], kwargs['gain_flatmax']
try: # nf_min and nf_max are expected for a variable gain amp
nf_min = kwargs.pop('nf_min')
nf_max = kwargs.pop('nf_max')
except KeyError:
except KeyError as exc:
msg = f'missing nf_min or nf_max value input for amplifier: {type_variety} in equipment config'
raise EquipmentConfigError(msg)
raise EquipmentConfigError(msg) from exc
try: # remove all remaining nf inputs
del kwargs['nf0']
except KeyError:
@@ -253,8 +270,8 @@ class Amp(_JsonThing):
elif type_def == 'openroadm':
try:
nf_coef = kwargs.pop('nf_coef')
except KeyError: # nf_coef is expected for openroadm amp
raise EquipmentConfigError(f'missing nf_coef input for amplifier: {type_variety} in equipment config')
except KeyError as exc: # nf_coef is expected for openroadm amp
raise EquipmentConfigError(f'missing nf_coef input for amplifier: {type_variety} in equipment config') from exc
nf_def = Model_openroadm_ila(nf_coef)
elif type_def == 'openroadm_preamp':
nf_def = Model_openroadm_preamp()
@@ -264,28 +281,28 @@ class Amp(_JsonThing):
try: # nf_ram and gain_ram are expected for a hybrid amp
preamp_variety = kwargs.pop('preamp_variety')
booster_variety = kwargs.pop('booster_variety')
except KeyError:
msg = f'missing preamp/booster variety input for amplifier: {type_variety} in equipment config'
raise EquipmentConfigError(msg)
except KeyError as exc:
raise EquipmentConfigError(f'missing preamp/booster variety input for amplifier: {type_variety}'
+ ' in equipment config') from exc
dual_stage_def = Model_dual_stage(preamp_variety, booster_variety)
elif type_def == 'multi_band':
amplifiers = kwargs['amplifiers']
else:
raise EquipmentConfigError(f'Edfa type_def {type_def} does not exist')
json_data = load_json(config)
return cls(**{**kwargs, **json_data,
'nf_model': nf_def, 'dual_stage_model': dual_stage_def})
# raise an error if config does not contain f_min, f_max
if 'f_min' not in config or 'f_max' not in config:
raise EquipmentConfigError(f'Config file {config_filename} does not contain f_min and f_max values.'
+ ' Please correct file.')
# use f_min, f_max from kwargs
if 'f_min' in kwargs:
config.pop('f_min', None)
config.pop('f_max', None)
return cls(**{**kwargs, **config,
'nf_model': nf_def, 'dual_stage_model': dual_stage_def, 'multi_band': amplifiers})
def _automatic_spacing(baud_rate):
"""return the min possible channel spacing for a given baud rate"""
# TODO : this should parametrized in a cfg file
# list of possible tuples [(max_baud_rate, spacing_for_this_baud_rate)]
spacing_list = [(33e9, 37.5e9), (38e9, 50e9), (50e9, 62.5e9), (67e9, 75e9), (92e9, 100e9)]
return min((s[1] for s in spacing_list if s[0] > baud_rate), default=baud_rate * 1.2)
def _spectrum_from_json(json_data):
def _spectrum_from_json(json_data: dict):
"""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.
@@ -294,7 +311,7 @@ def _spectrum_from_json(json_data):
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},\
'delta_pdb': 1, 'tx_osnr': 45, 'tx_power_dbm': -7},\
{'f_min': 193.4625e12, 'f_max': 193.9875e12, 'slot_width': 75e9, 'baud_rate': 64e9, 'roll_off': 0.15},\
{'f_min': 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}]}
@@ -302,24 +319,24 @@ def _spectrum_from_json(json_data):
>>> 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')
193200000000000.0: Carrier(delta_pdb=1, baud_rate=32000000000.0, slot_width=50000000000.0, roll_off=0.15, tx_osnr=45, tx_power=0.00019952623149688798, label='0-32.00G')
193250000000000.0: Carrier(delta_pdb=1, baud_rate=32000000000.0, slot_width=50000000000.0, roll_off=0.15, tx_osnr=45, tx_power=0.00019952623149688798, label='0-32.00G')
193300000000000.0: Carrier(delta_pdb=1, baud_rate=32000000000.0, slot_width=50000000000.0, roll_off=0.15, tx_osnr=45, tx_power=0.00019952623149688798, label='0-32.00G')
193350000000000.0: Carrier(delta_pdb=1, baud_rate=32000000000.0, slot_width=50000000000.0, roll_off=0.15, tx_osnr=45, tx_power=0.00019952623149688798, label='0-32.00G')
193400000000000.0: Carrier(delta_pdb=1, baud_rate=32000000000.0, slot_width=50000000000.0, roll_off=0.15, tx_osnr=45, tx_power=0.00019952623149688798, label='0-32.00G')
193462500000000.0: Carrier(delta_pdb=0, baud_rate=64000000000.0, slot_width=75000000000.0, roll_off=0.15, tx_osnr=40, tx_power=0.001, label='1-64.00G')
193537500000000.0: Carrier(delta_pdb=0, baud_rate=64000000000.0, slot_width=75000000000.0, roll_off=0.15, tx_osnr=40, tx_power=0.001, label='1-64.00G')
193612500000000.0: Carrier(delta_pdb=0, baud_rate=64000000000.0, slot_width=75000000000.0, roll_off=0.15, tx_osnr=40, tx_power=0.001, label='1-64.00G')
193687500000000.0: Carrier(delta_pdb=0, baud_rate=64000000000.0, slot_width=75000000000.0, roll_off=0.15, tx_osnr=40, tx_power=0.001, label='1-64.00G')
193762500000000.0: Carrier(delta_pdb=0, baud_rate=64000000000.0, slot_width=75000000000.0, roll_off=0.15, tx_osnr=40, tx_power=0.001, label='1-64.00G')
193837500000000.0: Carrier(delta_pdb=0, baud_rate=64000000000.0, slot_width=75000000000.0, roll_off=0.15, tx_osnr=40, tx_power=0.001, label='1-64.00G')
193912500000000.0: Carrier(delta_pdb=0, baud_rate=64000000000.0, slot_width=75000000000.0, roll_off=0.15, tx_osnr=40, tx_power=0.001, label='1-64.00G')
193987500000000.0: Carrier(delta_pdb=0, baud_rate=64000000000.0, slot_width=75000000000.0, roll_off=0.15, tx_osnr=40, tx_power=0.001, label='1-64.00G')
194075000000000.0: Carrier(delta_pdb=0, baud_rate=90000000000.0, slot_width=100000000000.0, roll_off=0.15, tx_osnr=40, tx_power=0.001, label='2-90.00G')
194200000000000.0: Carrier(delta_pdb=0, baud_rate=32000000000.0, slot_width=50000000000.0, roll_off=0.15, tx_osnr=40, tx_power=0.001, label='3-32.00G')
194250000000000.0: Carrier(delta_pdb=0, baud_rate=32000000000.0, slot_width=50000000000.0, roll_off=0.15, tx_osnr=40, tx_power=0.001, label='3-32.00G')
194300000000000.0: Carrier(delta_pdb=0, baud_rate=32000000000.0, slot_width=50000000000.0, roll_off=0.15, tx_osnr=40, tx_power=0.001, label='3-32.00G')
194350000000000.0: Carrier(delta_pdb=0, baud_rate=32000000000.0, slot_width=50000000000.0, roll_off=0.15, tx_osnr=40, tx_power=0.001, label='3-32.00G')
"""
spectrum = {}
json_data = sorted(json_data, key=lambda x: x['f_min'])
@@ -327,14 +344,13 @@ def _spectrum_from_json(json_data):
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
part.setdefault('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'
part.setdefault('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
part.setdefault('tx_osnr', 40)
# default tx_power_dbm is set to 0 dBn
part.setdefault('tx_power_dbm', 0)
# starting freq is exactly f_min to be consistent with utils.automatic_nch
# first partition min occupation is f_min - slot_width / 2 (central_frequency is f_min)
# supposes that carriers are centered on frequency
@@ -348,27 +364,89 @@ def _spectrum_from_json(json_data):
raise ValueError(msg)
max_range = ((part['f_max'] - part['f_min']) // part['slot_width'] + 1) * part['slot_width']
previous_part_max_freq = None
for current_freq in arange(part['f_min'],
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'])
tx_osnr=part['tx_osnr'], tx_power=dbm2watt(part['tx_power_dbm']),
label=part['label'])
previous_part_max_freq = current_freq + part['slot_width'] / 2
return spectrum
def load_equipment(filename):
def merge_equipment(equipment: dict, additional_filenames: List[Path], extra_configs: Dict[str, Path]):
"""Merge additional equipment libraries into the base equipment dictionary.
Typical case is the use of third party transceivers which are not part of a the supplier library.
raise warnings if the same reference is used on two different libraries
"""
for filename in additional_filenames:
extra_eqpt = load_equipment(filename, extra_configs)
# populate with default eqpt to streamline loading
for eqpt_type, extra_items in extra_eqpt.items():
for type_variety, item in extra_items.items():
if type_variety not in equipment[eqpt_type]:
equipment[eqpt_type][type_variety] = item
else:
msg = f'\n\tEquipment file {filename.name}: duplicate equipment entry found: {eqpt_type}-{type_variety}\n'
_logger.warning(msg)
def load_equipments_and_configs(equipment_filename: Path,
extra_equipment_filenames: List[Path],
extra_config_filenames: List[Path]) -> dict:
"""Loads equipment configurations and merge with additional equipment and configuration files.
Args:
equipment_filename (Path): The path to the primary equipment configuration file.
extra_equipment_filenames (List[Path]): A list of paths to additional equipment configuration files to merge.
extra_config_filenames (List[Path]): A list of paths to additional configuration files to include.
Returns:
dict: A dictionary containing the loaded equipment configurations.
Notes:
If no equipment filename is provided, a default equipment configuration will be used.
Additional configurations from `extra_config_filenames` will override the default configurations.
If `extra_equipment_filenames` are provided, their contents will be merged into the loaded equipment.
"""
extra_configs = DEFAULT_EXTRA_CONFIG
if not equipment_filename:
equipment_filename = DEFAULT_EQPT_CONFIG
if extra_config_filenames:
extra_configs = {f.name: f for f in extra_config_filenames}
for k, v in DEFAULT_EXTRA_CONFIG.items():
extra_configs[k] = v
equipment = load_equipment(equipment_filename, extra_configs)
if extra_equipment_filenames:
merge_equipment(equipment, extra_equipment_filenames, extra_configs)
return equipment
def load_equipment(filename: Path, extra_configs: Dict[str, Path] = DEFAULT_EXTRA_CONFIG) -> dict:
"""Load equipment, returns equipment dict
"""
json_data = load_json(filename)
return _equipment_from_json(json_data, filename)
return _equipment_from_json(json_data, extra_configs)
def load_initial_spectrum(filename):
def load_initial_spectrum(filename: Path) -> dict:
"""Load spectrum to propagate, returns spectrum dict
"""
json_data = load_json(filename)
return _spectrum_from_json(json_data['spectrum'])
def _update_dual_stage(equipment):
def _update_dual_stage(equipment: dict):
"""Update attributes of all dual stage amps with the preamp and booster attributes
(defined in the equipment dictionary)
Returns the updated equiment dictionary
"""
if 'Edfa' not in equipment:
return
edfa_dict = equipment['Edfa']
for edfa in edfa_dict.values():
if edfa.type_def == 'dual_stage':
@@ -387,16 +465,45 @@ def _update_dual_stage(equipment):
return equipment
def _roadm_restrictions_sanity_check(equipment):
def _update_band(equipment: dict):
"""Creates a list of bands for this amplifier, and remove other parameters which are not applicable
"""
if 'Edfa' not in equipment:
return
amp_dict = equipment['Edfa']
for amplifier in amp_dict.values():
if amplifier.type_def != 'multi_band':
amplifier.bands = [{'f_min': amplifier.f_min,
'f_max': amplifier.f_max}]
# updates band parameter
else:
_bands = [{'f_min': amp_dict[a].f_min,
'f_max': amp_dict[a].f_max} for a in amp_dict[amplifier.type_variety].multi_band]
# remove duplicates
amplifier.bands = []
for b in _bands:
if b not in amplifier.bands:
amplifier.bands.append(b)
# remove non applicable parameters
for key in ['f_min', 'f_max', 'gain_flatmax', 'gain_min', 'p_max', 'nf_model', 'dual_stage_model',
'nf_fit_coeff', 'nf_ripple', 'dgt', 'gain_ripple']:
delattr(amplifier, key)
def _roadm_restrictions_sanity_check(equipment: dict):
"""verifies that booster and preamp restrictions specified in roadm equipment are listed in the edfa."""
restrictions = equipment['Roadm']['default'].restrictions['booster_variety_list'] + \
equipment['Roadm']['default'].restrictions['preamp_variety_list']
if 'Roadm' not in equipment:
return equipment
for roadm_type, roadm_eqpt in equipment['Roadm'].items():
restrictions = roadm_eqpt.restrictions['booster_variety_list'] + \
roadm_eqpt.restrictions['preamp_variety_list']
for amp_name in restrictions:
if amp_name not in equipment['Edfa']:
raise EquipmentConfigError(f'ROADM restriction {amp_name} does not refer to a defined EDFA name')
raise EquipmentConfigError(f'ROADM {roadm_type} restriction {amp_name} does not refer to a '
+ 'defined EDFA name')
def _check_fiber_vs_raman_fiber(equipment):
def _check_fiber_vs_raman_fiber(equipment: dict):
"""Ensure that Fiber and RamanFiber with the same name define common properties equally"""
if 'RamanFiber' not in equipment:
return
@@ -411,7 +518,20 @@ def _check_fiber_vs_raman_fiber(equipment):
f'disagrees for "{attr}": {a} != {b}')
def _equipment_from_json(json_data, filename):
def _si_sanity_check(equipment):
"""Check that 'default' key correctly exists in SI list. (There must be at list one element and it must be default)
If not create one entry in the list with this key.
"""
if 'SI' not in equipment:
return
possible_SI = list(equipment['SI'].keys())
if 'default' not in possible_SI:
# Use "default" key in the equipment, using the first listed keys
equipment['SI']['default'] = equipment['SI'][possible_SI[0]]
del equipment['SI'][possible_SI[0]]
def _equipment_from_json(json_data: dict, extra_configs: Dict[str, Path]) -> dict:
"""build global dictionnary eqpt_library that stores all eqpt characteristics:
edfa type type_variety, fiber type_variety
from the eqpt_config.json (filename parameter)
@@ -426,7 +546,7 @@ def _equipment_from_json(json_data, filename):
for entry in entries:
subkey = entry.get('type_variety', 'default')
if key == 'Edfa':
equipment[key][subkey] = Amp.from_json(filename, **entry)
equipment[key][subkey] = Amp.from_json(extra_configs, **entry)
elif key == 'Fiber':
equipment[key][subkey] = Fiber(**entry)
elif key == 'Span':
@@ -434,6 +554,9 @@ def _equipment_from_json(json_data, filename):
elif key == 'Roadm':
equipment[key][subkey] = Roadm(**entry)
elif key == 'SI':
# use power_dbm value for tx_power_dbm if the key is not in 'SI'
# if 'tx_power_dbm' not in entry.keys():
# entry['tx_power_dbm'] = entry['power_dbm']
equipment[key][subkey] = SI(**entry)
elif key == 'Transceiver':
equipment[key][subkey] = Transceiver(**entry)
@@ -442,12 +565,19 @@ def _equipment_from_json(json_data, filename):
else:
raise EquipmentConfigError(f'Unrecognized network element type "{key}"')
_check_fiber_vs_raman_fiber(equipment)
equipment = _update_dual_stage(equipment)
_update_dual_stage(equipment)
_update_band(equipment)
_roadm_restrictions_sanity_check(equipment)
_si_sanity_check(equipment)
return equipment
def load_network(filename, equipment):
def load_network(filename: Path, equipment: dict) -> DiGraph:
"""load network json or excel
:param filename: input file to read from
:param equipment: equipment library
"""
if filename.suffix.lower() in ('.xls', '.xlsx'):
json_data = xls_to_json_data(filename)
elif filename.suffix.lower() == '.json':
@@ -471,19 +601,22 @@ def _cls_for(equipment_type):
return elements.Edfa
if equipment_type == 'Fused':
return elements.Fused
elif equipment_type == 'Roadm':
if equipment_type == 'Roadm':
return elements.Roadm
elif equipment_type == 'Transceiver':
if equipment_type == 'Transceiver':
return elements.Transceiver
elif equipment_type == 'Fiber':
if equipment_type == 'Fiber':
return elements.Fiber
elif equipment_type == 'RamanFiber':
if equipment_type == 'RamanFiber':
return elements.RamanFiber
else:
if equipment_type == 'Multiband_amplifier':
return elements.Multiband_amplifier
raise ConfigurationError(f'Unknown network equipment "{equipment_type}"')
def network_from_json(json_data, equipment):
def network_from_json(json_data: dict, equipment: dict) -> DiGraph:
"""create digraph based on json input dict and using equipment library to fill in the gaps
"""
# NOTE|dutc: we could use the following, but it would tie our data format
# too closely to the graph library
# from networkx import node_link_graph
@@ -492,7 +625,55 @@ def network_from_json(json_data, equipment):
typ = el_config.pop('type')
variety = el_config.pop('type_variety', 'default')
cls = _cls_for(typ)
if typ == 'Fused':
if typ == 'Transceiver':
temp = el_config.setdefault('params', {})
if typ == 'Multiband_amplifier':
if variety in ['default', '']:
extra_params = None
temp = el_config.setdefault('params', {})
temp = merge_amplifier_restrictions(temp, deepcopy(MultiBandParams.default_values))
el_config['params'] = temp
else:
extra_params = equipment['Edfa'][variety]
temp = el_config.setdefault('params', {})
# use config params preferably to library params, only use library params to fill in
# the missing attribute
temp = merge_amplifier_restrictions(temp, deepcopy(extra_params.__dict__))
el_config['params'] = temp
el_config['type_variety'] = variety
# if config does not contain any amp list create one
amps = el_config.setdefault('amplifiers', [])
for amp in amps:
amp_variety = amp['type_variety'] # juste pour essayer
amp_extra_params = equipment['Edfa'][amp_variety]
temp = amp.setdefault('params', {})
temp = merge_amplifier_restrictions(temp, amp_extra_params.__dict__)
amp['params'] = temp
amp['type_variety'] = amp_variety
# check type_variety consistant with amps type_variety
if amps:
try:
multiband_type_variety = find_type_variety([a['type_variety'] for a in amps], equipment)
except ConfigurationError as e:
msg = f'Node {el_config["uid"]}: {e}'
raise ConfigurationError(msg)
if variety is not None and variety not in multiband_type_variety:
raise ConfigurationError(f'In node {el_config["uid"]}: multiband amplifier type_variety is not '
+ 'consistent with its amps type varieties.')
if not amps and extra_params is not None:
# the amp config does not contain the amplifiers operational settings, but has a type_variety
# defined so that it is possible to create the template of amps for design for each band. This
# defines the default design bands.
# This lopp populates each amp with default values, for each band
for band in extra_params.bands:
params = {k: v for k, v in Amp.default_values.items()}
# update frequencies with band values
params['f_min'] = band['f_min']
params['f_max'] = band['f_max']
amps.append({'params': params})
# without type_variety, it is not possible to set the amplifier dict at this point: need to wait
# for design, and use user defined design-bands
elif typ == 'Fused':
# well, there's no variety for the 'Fused' node type
pass
elif variety in equipment[typ]:
@@ -509,7 +690,7 @@ def network_from_json(json_data, equipment):
temp = merge_amplifier_restrictions(temp, extra_params)
el_config['params'] = temp
el_config['type_variety'] = variety
elif (typ in ['Fiber', 'RamanFiber']):
elif (typ in ['Fiber', 'RamanFiber', 'Roadm']):
raise ConfigurationError(f'The {typ} of variety type {variety} was not recognized:'
'\nplease check it is properly defined in the eqpt_config json file')
elif typ == 'Edfa':
@@ -531,14 +712,16 @@ def network_from_json(json_data, equipment):
else:
edge_length = 0.01
g.add_edge(nodes[from_node], nodes[to_node], weight=edge_length)
except KeyError:
except KeyError as exc:
msg = f'can not find {from_node} or {to_node} defined in {cx}'
raise NetworkTopologyError(msg)
raise NetworkTopologyError(msg) from exc
return g
def network_to_json(network):
def network_to_json(network: DiGraph) -> dict:
"""Export network graph as a json dict
"""
data = {
'elements': [n.to_json for n in network]
}
@@ -552,55 +735,62 @@ def network_to_json(network):
return data
def load_json(filename):
def load_json(filename: Path) -> dict:
"""load json data, convert from the yang to the legacy
supports both legacy ang yang formatted inputs based on yang models
"""
with open(filename, 'r', encoding='utf-8') as f:
data = json.load(f)
return data
def save_json(obj, filename):
def save_json(obj: Dict, filename: Path):
"""Save in json format. Use yang formatted data for Topo and Services
"""
with open(filename, 'w', encoding='utf-8') as f:
json.dump(obj, f, indent=2, ensure_ascii=False)
def load_requests(filename, eqpt, bidir, network, network_filename):
def load_requests(filename: Path, eqpt: dict, bidir: bool, network: DiGraph, network_filename: str) -> dict:
"""loads the requests from a json or an excel file into a data string"""
if filename.suffix.lower() in ('.xls', '.xlsx'):
_logger.info('Automatically converting requests from XLS to JSON')
try:
return convert_service_sheet(filename, eqpt, network, network_filename=network_filename, bidir=bidir)
except ServiceError as this_e:
raise ServiceError(f'Service error: {this_e}')
raise ServiceError(f'Service error: {this_e}') from this_e
else:
return load_json(filename)
def requests_from_json(json_data, equipment):
def requests_from_json(json_data: dict, equipment: dict) -> List[PathRequest]:
"""Extract list of requests from data parsed from JSON"""
requests_list = []
for req in json_data['path-request']:
# init all params from request
params = {}
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']
if params['trx_type'] is None:
trx_type = req['path-constraints']['te-bandwidth']['trx_type']
trx_mode = req['path-constraints']['te-bandwidth'].get('trx_mode', None)
if trx_type is None:
msg = f'Request {req["request-id"]} has no transceiver type defined.'
raise ServiceError(msg)
params['trx_mode'] = req['path-constraints']['te-bandwidth'].get('trx_mode', None)
params['format'] = params['trx_mode']
params['spacing'] = req['path-constraints']['te-bandwidth']['spacing']
try:
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]
params['loose_list'] = [n['num-unnum-hop']['hop-type'] for n in nd_list]
params = {
'request_id': f'{req["request-id"]}',
'source': req['source'],
'destination': req['destination'],
'bidir': req['bidirectional'],
'trx_type': trx_type,
'trx_mode': trx_mode,
'format': trx_mode,
'spacing': req['path-constraints']['te-bandwidth']['spacing'],
'nodes_list': [n['num-unnum-hop']['node-id'] for n in nd_list],
'loose_list': [n['num-unnum-hop']['hop-type'] for n in nd_list]
}
# recover trx physical param (baudrate, ...) from type and mode
# in trx_mode_params optical power is read from equipment['SI']['default'] and
# nb_channel is computed based on min max frequency and spacing
try:
trx_params = trx_mode_params(equipment, params['trx_type'], params['trx_mode'], True)
@@ -608,13 +798,11 @@ def requests_from_json(json_data, equipment):
msg = f'Equipment Config error in {req["request-id"]}: {e}'
raise EquipmentConfigError(msg) from e
params.update(trx_params)
# optical power might be set differently in the request. if it is indicated then the
# params['power'] is updated
try:
if req['path-constraints']['te-bandwidth']['output-power']:
params['power'] = req['path-constraints']['te-bandwidth']['output-power']
except KeyError:
pass
params['power'] = req['path-constraints']['te-bandwidth'].get('output-power')
# params must not be None, but user can set to None: catch this case
if params['power'] is None:
params['power'] = dbm2watt(equipment['SI']['default'].power_dbm)
# same process for nb-channel
f_min = params['f_min']
f_max_from_si = params['f_max']
@@ -634,12 +822,20 @@ def requests_from_json(json_data, equipment):
params['path_bandwidth'] = req['path-constraints']['te-bandwidth']['path_bandwidth']
except KeyError:
pass
params['tx_power'] = req['path-constraints']['te-bandwidth'].get('tx_power')
default_tx_power_dbm = equipment['SI']['default'].tx_power_dbm
if params['tx_power'] is None:
# use request's input power in span instead
params['tx_power'] = params['power']
if default_tx_power_dbm is not None:
# use default tx power
params['tx_power'] = dbm2watt(default_tx_power_dbm)
_check_one_request(params, f_max_from_si)
requests_list.append(PathRequest(**params))
return requests_list
def _check_one_request(params, f_max_from_si):
def _check_one_request(params: dict, f_max_from_si: float):
"""Checks that the requested parameters are consistant (spacing vs nb channel vs transponder mode...)"""
f_min = params['f_min']
f_max = params['f_max']
@@ -659,7 +855,7 @@ def _check_one_request(params, f_max_from_si):
raise ServiceError(msg)
# Transponder mode already selected; will it fit to the requested bandwidth?
if params['trx_mode'] is not None and params['effective_freq_slot'] is not None:
required_nb_of_channels, requested_m = compute_spectrum_slot_vs_bandwidth(params['path_bandwidth'],
required_nb_of_channels, _ = compute_spectrum_slot_vs_bandwidth(params['path_bandwidth'],
params['spacing'],
params['bit_rate'])
_, per_channel_m = compute_spectrum_slot_vs_bandwidth(params['bit_rate'],
@@ -700,7 +896,7 @@ def _check_one_request(params, f_max_from_si):
i += 1
def disjunctions_from_json(json_data):
def disjunctions_from_json(json_data: dict) -> List[Disjunction]:
"""reads the disjunction requests from the json dict and create the list
of requested disjunctions for this set of requests
"""
@@ -719,12 +915,22 @@ def disjunctions_from_json(json_data):
def convert_service_sheet(
input_filename,
eqpt,
network,
network_filename=None,
output_filename='',
bidir=False):
input_filename: Path,
eqpt: dict,
network: DiGraph,
network_filename: Union[Path, None] = None,
output_filename: str = '',
bidir: bool = False):
"""Converts xls into json format services
:param input_filename: xls(x) file containing the service sheet
:param eqpt: equipment library
:param network: network for which these services apply (required for xls inputs to correct names)
:param network_filename: optional network file name that was used for network creation
(required for xls inputs to correct names)
:param output_filename: name of the file where converted data are savec
:param bidir: set all services bidir attribute with this bool
"""
if output_filename == '':
output_filename = f'{str(input_filename)[0:len(str(input_filename)) - len(str(input_filename.suffixes[0]))]}_services.json'
data = read_service_sheet(input_filename, eqpt, network, network_filename, bidir)
@@ -732,7 +938,7 @@ def convert_service_sheet(
return data
def find_equalisation(params, equalization_types):
def find_equalisation(params: Dict, equalization_types: List[str]):
"""Find the equalization(s) defined in params. params can be a dict or a Roadm object.
>>> roadm = {'add_drop_osnr': 100, 'pmd': 1, 'pdl': 0.5,
@@ -749,7 +955,7 @@ def find_equalisation(params, equalization_types):
return equalization
def merge_equalization(params, extra_params):
def merge_equalization(params: dict, extra_params: dict) -> Union[dict, None]:
"""params contains ROADM element config and extra_params default values from equipment library.
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)

View File

@@ -11,105 +11,150 @@ Yang model for requesting path computation.
See: draft-ietf-teas-yang-path-computation-01.txt
"""
from xlrd import open_workbook, XL_CELL_EMPTY
from collections import namedtuple
from logging import getLogger
from copy import deepcopy
from pathlib import Path
from typing import Dict, List
from networkx import DiGraph
from xlrd import open_workbook, XL_CELL_EMPTY
from gnpy.core.utils import db2lin
from gnpy.core.exceptions import ServiceError
from gnpy.core.elements import Transceiver, Roadm, Edfa, Fiber
from gnpy.tools.convert import corresp_names, corresp_next_node
from gnpy.tools.convert import corresp_names, corresp_next_node, all_rows
SERVICES_COLUMN = 12
def all_rows(sheet, start=0):
return (sheet.row(x) for x in range(start, sheet.nrows))
logger = getLogger(__name__)
class Request(namedtuple('Request', 'request_id source destination trx_type mode \
class Request(namedtuple('request_param', 'request_id source destination trx_type mode \
spacing power nb_channel disjoint_from nodes_list is_loose path_bandwidth')):
def __new__(cls, request_id, source, destination, trx_type, mode=None, spacing=None, power=None, nb_channel=None, disjoint_from='', nodes_list=None, is_loose='', path_bandwidth=None):
return super().__new__(cls, request_id, source, destination, trx_type, mode, spacing, power, nb_channel, disjoint_from, nodes_list, is_loose, path_bandwidth)
"""DATA class for a request.
:params request_id (int): The unique identifier for the request.
:params source (str): The source node for the communication.
:params destination (str): The destination node for the communication.
:params trx_type (str): The type of transmission for the communication.
:params mode (str, optional): The mode of transmission. Defaults to None.
:params spacing (float, optional): The spacing between channels. Defaults to None.
:params power (float, optional): The power level for the communication. Defaults to None.
:params nb_channel (int, optional): The number of channels required for the communication. Defaults to None.
:params disjoint_from (str, optional): The node to be disjoint from. Defaults to ''.
:params nodes_list (list, optional): The list of nodes involved in the communication. Defaults to None.
:params is_loose (str, optional): Indicates if the communication is loose. Defaults to ''.
:params path_bandwidth (float, optional): The bandwidth required for the communication. Defaults to None.
"""
def __new__(cls, request_id, source, destination, trx_type, mode=None, spacing=None, power=None, nb_channel=None,
disjoint_from='', nodes_list=None, is_loose='', path_bandwidth=None):
return super().__new__(cls, request_id, source, destination, trx_type, mode, spacing, power, nb_channel,
disjoint_from, nodes_list, is_loose, path_bandwidth)
class Element:
"""
"""
def __init__(self, uid):
self.uid = uid
def __eq__(self, other):
return type(self) == type(other) and self.uid == other.uid
return isinstance(other, type(self)) and self.uid == other.ui
def __hash__(self):
return hash((type(self), self.uid))
class Request_element(Element):
def __init__(self, Request, equipment, bidir):
"""Class that generate the request in the json format
:params request_param (Request): The request object containing the information for the element.
:params equipment (dict): The equipment configuration for the communication.
:params bidir (bool): Indicates if the communication is bidirectional.
Attributes:
request_id (str): The unique identifier for the request.
source (str): The source node for the communication.
destination (str): The destination node for the communication.
srctpid (str): The source TP ID for the communication.
dsttpid (str): The destination TP ID for the communication.
bidir (bool): Indicates if the communication is bidirectional.
trx_type (str): The type of transmission for the communication.
mode (str): The mode of transmission for the communication.
spacing (float): The spacing between channels for the communication.
power (float): The power level for the communication.
nb_channel (int): The number of channels required for the communication.
disjoint_from (list): The list of nodes to be disjoint from.
nodes_list (list): The list of nodes involved in the communication.
loose (str): Indicates if the communication is loose or strict.
path_bandwidth (float): The bandwidth required for the communication.
"""
def __init__(self, request_param: Request, equipment: Dict, bidir: bool):
"""
"""
super().__init__(uid=request_param.request_id)
# request_id is str
# excel has automatic number formatting that adds .0 on integer values
# the next lines recover the pure int value, assuming this .0 is unwanted
self.request_id = correct_xlrd_int_to_str_reading(Request.request_id)
self.source = f'trx {Request.source}'
self.destination = f'trx {Request.destination}'
self.request_id = correct_xlrd_int_to_str_reading(request_param.request_id)
self.source = f'trx {request_param.source}'
self.destination = f'trx {request_param.destination}'
# TODO: the automatic naming generated by excel parser requires that source and dest name
# be a string starting with 'trx' : this is manually added here.
self.srctpid = f'trx {Request.source}'
self.dsttpid = f'trx {Request.destination}'
self.srctpid = f'trx {request_param.source}'
self.dsttpid = f'trx {request_param.destination}'
self.bidir = bidir
# test that trx_type belongs to eqpt_config.json
# if not replace it with a default
try:
if equipment['Transceiver'][Request.trx_type]:
self.trx_type = correct_xlrd_int_to_str_reading(Request.trx_type)
if Request.mode is not None:
Requestmode = correct_xlrd_int_to_str_reading(Request.mode)
if [mode for mode in equipment['Transceiver'][Request.trx_type].mode if mode['format'] == Requestmode]:
self.mode = Requestmode
if equipment['Transceiver'][request_param.trx_type]:
self.trx_type = correct_xlrd_int_to_str_reading(request_param.trx_type)
if request_param.mode is not None:
request_mode = correct_xlrd_int_to_str_reading(request_param.mode)
if [mode for mode in equipment['Transceiver'][request_param.trx_type].mode
if mode['format'] == request_mode]:
self.mode = request_mode
else:
msg = f'Request Id: {self.request_id} - could not find tsp : \'{Request.trx_type}\' ' \
+ f'with mode: \'{Requestmode}\' in eqpt library \nComputation stopped.'
msg = f'Request Id: {self.request_id} - could not find tsp : \'{request_param.trx_type}\' ' \
+ f'with mode: \'{request_mode}\' in eqpt library \nComputation stopped.'
raise ServiceError(msg)
else:
Requestmode = None
self.mode = Request.mode
except KeyError:
msg = f'Request Id: {self.request_id} - could not find tsp : \'{Request.trx_type}\' ' \
+ f'with mode: \'{Request.mode}\' in eqpt library \nComputation stopped.'
raise ServiceError(msg)
request_mode = None
self.mode = request_param.mode
except KeyError as e:
msg = f'Request Id: {self.request_id} - could not find tsp : \'{request_param.trx_type}\' with mode: ' \
+ f'\'{request_param.mode}\' in eqpt library \nComputation stopped.'
raise ServiceError(msg) from e
# excel input are in GHz and dBm
if Request.spacing is not None:
self.spacing = Request.spacing * 1e9
if request_param.spacing is not None:
self.spacing = request_param.spacing * 1e9
else:
msg = f'Request {self.request_id} missing spacing: spacing is mandatory.\ncomputation stopped'
raise ServiceError(msg)
if Request.power is not None:
self.power = db2lin(Request.power) * 1e-3
else:
self.power = None
if Request.nb_channel is not None:
self.nb_channel = int(Request.nb_channel)
else:
if request_param.power is not None:
self.power = db2lin(request_param.power) * 1e-3
self.nb_channel = None
if request_param.nb_channel is not None:
self.nb_channel = int(request_param.nb_channel)
value = correct_xlrd_int_to_str_reading(Request.disjoint_from)
value = correct_xlrd_int_to_str_reading(request_param.disjoint_from)
self.disjoint_from = [n for n in value.split(' | ') if value]
self.nodes_list = []
if Request.nodes_list:
self.nodes_list = Request.nodes_list.split(' | ')
if request_param.nodes_list:
self.nodes_list = request_param.nodes_list.split(' | ')
self.loose = 'LOOSE'
if Request.is_loose.lower() == 'no':
if request_param.is_loose.lower() == 'no':
self.loose = 'STRICT'
self.path_bandwidth = None
if Request.path_bandwidth is not None:
self.path_bandwidth = Request.path_bandwidth * 1e9
else:
self.path_bandwidth = 0
uid = property(lambda self: repr(self))
if request_param.path_bandwidth is not None:
self.path_bandwidth = request_param.path_bandwidth * 1e9
@property
def pathrequest(self):
"""Creates json dictionnary for the request
"""
# Default assumption for bidir is False
req_dictionnary = {
'request-id': self.request_id,
@@ -152,29 +197,32 @@ class Request_element(Element):
@property
def pathsync(self):
"""Creates json dictionnary for disjunction list (synchronization vector)
"""
if self.disjoint_from:
return {'synchronization-id': self.request_id,
'svec': {
'relaxable': 'false',
'disjointness': 'node link',
'request-id-number': [self.request_id] + [n for n in self.disjoint_from]
'request-id-number': [self.request_id] + list(self.disjoint_from)
}
}
else:
return None
# TO-DO: avoid multiple entries with same synchronisation vectors
@property
def json(self):
"""Returns the json dictionnary for requests and for synchronisation vector
"""
return self.pathrequest, self.pathsync
def read_service_sheet(
input_filename,
eqpt,
network,
network_filename=None,
bidir=False):
input_filename: Path,
eqpt: Dict,
network: DiGraph,
network_filename: Path = None,
bidir: bool = False) -> Dict:
""" converts a service sheet into a json structure
"""
if network_filename is None:
@@ -184,19 +232,16 @@ def read_service_sheet(
req = correct_xls_route_list(network_filename, network, req)
# if there is no sync vector , do not write any synchronization
synchro = [n.json[1] for n in req if n.json[1] is not None]
data = {'path-request': [n.json[0] for n in req]}
if synchro:
data = {
'path-request': [n.json[0] for n in req],
'synchronization': synchro
}
else:
data = {
'path-request': [n.json[0] for n in req]
}
data['synchronization'] = synchro
return data
def correct_xlrd_int_to_str_reading(v):
"""Utils: ensure that int values in id are read as strings containing the int and
do not use the automatic float conversion from xlrd
"""
if not isinstance(v, str):
value = str(int(v))
if value.endswith('.0'):
@@ -206,22 +251,27 @@ def correct_xlrd_int_to_str_reading(v):
return value
def parse_row(row, fieldnames):
def parse_row(row: List, fieldnames: List[str]) -> Dict:
"""Reads each values in a row and creates a dict using field names
"""
return {f: r.value for f, r in zip(fieldnames, row[0:SERVICES_COLUMN])
if r.ctype != XL_CELL_EMPTY}
def parse_excel(input_filename):
def parse_excel(input_filename: Path) -> List[Request]:
"""Opens xls_file and reads 'Service' sheet
Returns the list of services data in Request class
"""
with open_workbook(input_filename) as wb:
service_sheet = wb.sheet_by_name('Service')
services = list(parse_service_sheet(service_sheet))
return services
def parse_service_sheet(service_sheet):
def parse_service_sheet(service_sheet) -> Request:
""" reads each column according to authorized fieldnames. order is not important.
"""
logger.debug(f'Validating headers on {service_sheet.name!r}')
logger.debug('Validating headers on %r', service_sheet.name)
# add a test on field to enable the '' field case that arises when columns on the
# right hand side are used as comments or drawing in the excel sheet
header = [x.value.strip() for x in service_sheet.row(4)[0:SERVICES_COLUMN]
@@ -239,14 +289,52 @@ def parse_service_sheet(service_sheet):
'routing: is loose?': 'is_loose', 'path bandwidth': 'path_bandwidth'}
try:
service_fieldnames = [authorized_fieldnames[e] for e in header]
except KeyError:
except KeyError as e:
msg = f'Malformed header on Service sheet: {header} field not in {authorized_fieldnames}'
raise ValueError(msg)
raise ValueError(msg) from e
for row in all_rows(service_sheet, start=5):
yield Request(**parse_row(row[0:SERVICES_COLUMN], service_fieldnames))
def correct_xls_route_list(network_filename, network, pathreqlist):
def check_end_points(pathreq: Request_element, network: DiGraph):
"""Raise error if end point is not correct
"""
transponders = [n.uid for n in network.nodes() if isinstance(n, Transceiver)]
if pathreq.source not in transponders:
msg = f'Request: {pathreq.request_id}: could not find' +\
f' transponder source : {pathreq.source}.'
logger.critical(msg)
raise ServiceError(msg)
if pathreq.destination not in transponders:
msg = f'Request: {pathreq.request_id}: could not find' +\
f' transponder destination: {pathreq.destination}.'
logger.critical(msg)
raise ServiceError(msg)
def find_node_sugestion(n_id, corresp_roadm, corresp_fused, corresp_ila, network):
"""
"""
roadmtype = [n.uid for n in network.nodes() if isinstance(n, Roadm)]
edfatype = [n.uid for n in network.nodes() if isinstance(n, Edfa)]
# check that n_id is in the node list, if not find a correspondance name
if n_id in roadmtype + edfatype:
return [n_id]
# checks first roadm, fused, and ila in this order, because ila automatic name
# contains roadm names. If it is a fused node, next ila names might be correct
# suggestions, especially if following fibers were splitted and ila names
# created with the name of the fused node
if n_id in corresp_roadm.keys():
return corresp_roadm[n_id]
if n_id in corresp_fused.keys():
return corresp_fused[n_id] + corresp_ila[n_id]
if n_id in corresp_ila.keys():
return corresp_ila[n_id]
return []
def correct_xls_route_list(network_filename: Path, network: DiGraph,
pathreqlist: List[Request_element]) -> List[Request_element]:
""" prepares the format of route list of nodes to be consistant with nodes names:
remove wrong names, find correct names for ila, roadm and fused if the entry was
xls.
@@ -260,30 +348,17 @@ def correct_xls_route_list(network_filename, network, pathreqlist):
corresp_ila, next_node = corresp_next_node(network, corresp_ila, corresp_roadm)
# finally correct constraints based on these dict
trxfibertype = [n.uid for n in network.nodes() if isinstance(n, (Transceiver, Fiber))]
roadmtype = [n.uid for n in network.nodes() if isinstance(n, Roadm)]
edfatype = [n.uid for n in network.nodes() if isinstance(n, Edfa)]
# TODO there is a problem of identification of fibers in case of parallel
# fibers between two adjacent roadms so fiber constraint is not supported
transponders = [n.uid for n in network.nodes() if isinstance(n, Transceiver)]
for pathreq in pathreqlist:
# first check that source and dest are transceivers
if pathreq.source not in transponders:
msg = f'Request: {pathreq.request_id}: could not find' +\
f' transponder source : {pathreq.source}.'
raise ServiceError(msg)
if pathreq.destination not in transponders:
msg = f'Request: {pathreq.request_id}: could not find' +\
f' transponder destination: {pathreq.destination}.'
raise ServiceError(msg)
check_end_points(pathreq, network)
# silently pop source and dest nodes from the list if they were added by the user as first
# and last elem in the constraints respectively. Other positions must lead to an error
# caught later on
if pathreq.nodes_list and pathreq.source == pathreq.nodes_list[0]:
pathreq.loose_list.pop(0)
pathreq.nodes_list.pop(0)
if pathreq.nodes_list and pathreq.destination == pathreq.nodes_list[-1]:
pathreq.loose_list.pop(-1)
pathreq.nodes_list.pop(-1)
# Then process user defined constraints with respect to automatic namings
temp = deepcopy(pathreq)
@@ -293,73 +368,56 @@ def correct_xls_route_list(network_filename, network, pathreqlist):
# n_id must not be a transceiver and must not be a fiber (non supported, user
# can not enter fiber names in excel)
if n_id not in trxfibertype:
# check that n_id is in the node list, if not find a correspondance name
if n_id in roadmtype + edfatype:
nodes_suggestion = [n_id]
else:
# checks first roadm, fused, and ila in this order, because ila automatic name
# contain roadm names. If it is a fused node, next ila names might be correct
# suggestions, especially if following fibers were splitted and ila names
# created with the name of the fused node
if n_id in corresp_roadm.keys():
nodes_suggestion = corresp_roadm[n_id]
elif n_id in corresp_fused.keys():
nodes_suggestion = corresp_fused[n_id] + corresp_ila[n_id]
elif n_id in corresp_ila.keys():
nodes_suggestion = corresp_ila[n_id]
else:
nodes_suggestion = []
if nodes_suggestion:
nodes_suggestion = find_node_sugestion(n_id, corresp_roadm, corresp_fused, corresp_ila, network)
try:
if len(nodes_suggestion) > 1:
# if there is more than one suggestion, we need to choose the direction
# we rely on the next node provided by the user for this purpose
new_n = next(n for n in nodes_suggestion
if n in next_node.keys() and next_node[n]
in temp.nodes_list[i:] + [pathreq.destination] and
next_node[n] not in temp.nodes_list[:i])
else:
if n in next_node
and next_node[n] in temp.nodes_list[i:] + [pathreq.destination]
and next_node[n] not in temp.nodes_list[:i])
elif len(nodes_suggestion) == 1:
new_n = nodes_suggestion[0]
else:
if temp.loose == 'LOOSE':
# if no matching can be found in the network just ignore this constraint
# if it is a loose constraint
# warns the user that this node is not part of the topology
msg = f'{pathreq.request_id}: Invalid node specified:\n\t\'{n_id}\'' \
+ ', could not use it as constraint, skipped!'
print(msg)
logger.info(msg)
pathreq.nodes_list.remove(n_id)
continue
msg = f'{pathreq.request_id}: Could not find node:\n\t\'{n_id}\' in network' \
+ ' topology. Strict constraint can not be applied.'
raise ServiceError(msg)
if new_n != n_id:
# warns the user when the correct name is used only in verbose mode,
# eg 'a' is a roadm and correct name is 'roadm a' or when there was
# too much ambiguity, 'b' is an ila, its name can be:
# Edfa0_fiber (a → b)-xx if next node is c or
# Edfa0_fiber (c → b)-xx if next node is a
msg = f'Request {pathreq.request_id}: Invalid route node specified:' \
# "east edfa in b to c", or "west edfa in b to a" if next node is c or
# "west edfa in b to c", or "east edfa in b to a" if next node is a
msg = f'{pathreq.request_id}: Invalid route node specified:' \
+ f'\n\t\'{n_id}\', replaced with \'{new_n}\''
logger.warning(msg)
logger.info(msg)
pathreq.nodes_list[pathreq.nodes_list.index(n_id)] = new_n
except StopIteration:
# shall not come in this case, unless requested direction does not exist
msg = f'Request {pathreq.request_id}: Invalid route specified {n_id}: could' \
msg = f'{pathreq.request_id}: Invalid route specified {n_id}: could' \
+ ' not decide on direction, skipped!.\nPlease add a valid' \
+ ' direction in constraints (next neighbour node)'
logger.info(msg)
pathreq.nodes_list.remove(n_id)
else:
if temp.loose == 'LOOSE':
msg = f'{pathreq.request_id}: Invalid route node specified:\n\t\'{n_id}\'' \
+ ' type is not supported as constraint with xls network input, skipped!'
logger.warning(msg)
pathreq.loose_list.pop(pathreq.nodes_list.index(n_id))
pathreq.nodes_list.remove(n_id)
else:
if temp.loose_list[i] == 'LOOSE':
# if no matching can be found in the network just ignore this constraint
# if it is a loose constraint
# warns the user that this node is not part of the topology
msg = f'Request {pathreq.request_id}: Invalid node specified:\n\t\'{n_id}\'' \
+ ', could not use it as constraint, skipped!'
logger.warning(msg)
pathreq.loose_list.pop(pathreq.nodes_list.index(n_id))
pathreq.nodes_list.remove(n_id)
else:
msg = f'Request {pathreq.request_id}: Could not find node:\n\t\'{n_id}\' in network' \
+ ' topology. Strict constraint can not be applied.'
raise ServiceError(msg)
else:
if temp.loose_list[i] == 'LOOSE':
logger.warning(f'Request {pathreq.request_id}: Invalid route node specified:\n\t\'{n_id}\''
+ ' type is not supported as constraint with xls network input, skipped!')
pathreq.loose_list.pop(pathreq.nodes_list.index(n_id))
pathreq.nodes_list.remove(n_id)
else:
msg = f'Invalid route node specified \n\t\'{n_id}\'' \
msg = f'{pathreq.request_id}: Invalid route node specified \n\t\'{n_id}\'' \
+ ' type is not supported as constraint with xls network input,' \
+ ', Strict constraint can not be applied.'
raise ServiceError(msg)

248
gnpy/tools/worker_utils.py Normal file
View File

@@ -0,0 +1,248 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
'''
gnpy.tools.worker_utils
=======================
Common code for CLI examples and API
'''
import logging
from copy import deepcopy
from typing import Union, List, Tuple
from numpy import linspace
from networkx import DiGraph
from gnpy.core.utils import automatic_nch, watt2dbm, dbm2watt, pretty_summary_print, per_label_average
from gnpy.core.equipment import trx_mode_params
from gnpy.core.network import add_missing_elements_in_network, design_network
from gnpy.core import exceptions
from gnpy.core.info import SpectralInformation
from gnpy.topology.spectrum_assignment import build_oms_list, pth_assign_spectrum, OMS
from gnpy.topology.request import correct_json_route_list, deduplicate_disjunctions, requests_aggregation, \
compute_path_dsjctn, compute_path_with_disjunction, ResultElement, PathRequest, Disjunction, \
compute_constrained_path, propagate
from gnpy.tools.json_io import requests_from_json, disjunctions_from_json
logger = logging.getLogger(__name__)
def designed_network(equipment: dict, network: DiGraph, source: str = None, destination: str = None,
nodes_list: List[str] = None, loose_list: List[str] = None,
initial_spectrum: dict = None, no_insert_edfas: bool = False,
args_power: Union[str, float, int] = None,
service_req: PathRequest = None) -> Tuple[DiGraph, PathRequest, PathRequest]:
"""Build the reference channels based on inputs and design the network for this reference channel, and build the
channel to be propagated for the single transmission script.
Reference channel (target input power in spans, nb of channels, transceiver output power) is built using
equipment['SI'] information. If indicated, with target input power in spans is updated with args_power.
Channel to be propagated is using the same channel reference, except if different settings are provided
with service_req and initial_spectrum. The service to be propagated uses specified source, destination
and list nodes_list of include nodes constraint except if the service_req is specified.
Args:
- equipment: a dictionary containing equipment information.
- network: a directed graph representing the initial network.
- no_insert_edfas: a boolean indicating whether to insert EDFAs in the network.
- args_power: the power to be used for the network design.
- service_req: the service request the user wants to propagate.
- source: the source node for the channel to be propagated if no service_req is specified.
- destination: the destination node for the channel to be propagated if no service_req is specified.
- nodes_list: a list of nodes to be included ifor the channel to be propagated if no service_req is specified.
- loose_list: a list of loose nodes to be included in the network design.
- initial_spectrum: a dictionary representing the initial spectrum to propagate.
Returns:
- The designed network.
- The channel to propagate.
- The reference channel used for the design.
"""
if loose_list is None:
loose_list = []
if nodes_list is None:
nodes_list = []
if not no_insert_edfas:
add_missing_elements_in_network(network, equipment)
if not nodes_list:
if destination:
nodes_list = [destination]
loose_list = ['STRICT']
else:
nodes_list = []
loose_list = []
params = {
'request_id': 'reference',
'trx_type': '',
'trx_mode': '',
'source': source,
'destination': destination,
'bidir': False,
'nodes_list': nodes_list,
'loose_list': loose_list,
'format': '',
'path_bandwidth': 0,
'effective_freq_slot': None,
'nb_channel': automatic_nch(equipment['SI']['default'].f_min, equipment['SI']['default'].f_max,
equipment['SI']['default'].spacing),
'power': dbm2watt(equipment['SI']['default'].power_dbm),
'tx_power': None
}
params['tx_power'] = dbm2watt(equipment['SI']['default'].power_dbm)
if equipment['SI']['default'].tx_power_dbm is not None:
# use SI tx_power if present
params['tx_power'] = dbm2watt(equipment['SI']['default'].tx_power_dbm)
trx_params = trx_mode_params(equipment)
params.update(trx_params)
# use args_power instead of si
if args_power:
params['power'] = dbm2watt(float(args_power))
if equipment['SI']['default'].tx_power_dbm is None:
params['tx_power'] = params['power']
# use si as reference channel
reference_channel = PathRequest(**params)
# temporary till multiband design feat is available: do not design for L band
reference_channel.nb_channel = min(params['nb_channel'], automatic_nch(191.2e12, 196.0e12, params['spacing']))
if service_req:
# use service_req as reference channel with si tx_power if service_req tx_power is None
if service_req.tx_power is None:
service_req.tx_power = params['tx_power']
reference_channel = service_req
design_network(reference_channel, network, equipment, set_connector_losses=True, verbose=True)
if initial_spectrum:
params['nb_channel'] = len(initial_spectrum)
req = PathRequest(**params)
if service_req:
req = service_req
req.initial_spectrum = initial_spectrum
return network, req, reference_channel
def check_request_path_ids(rqs: List[PathRequest]):
"""check that request ids are unique. Non unique ids, may
mess the computation: better to stop the computation
"""
all_ids = [r.request_id for r in rqs]
if len(all_ids) != len(set(all_ids)):
for item in list(set(all_ids)):
all_ids.remove(item)
msg = f'Requests id {all_ids} are not unique'
logger.error(msg)
raise ValueError(msg)
def planning(network: DiGraph, equipment: dict, data: dict, redesign: bool = False) \
-> Tuple[List[OMS], list, list, List[PathRequest], List[Disjunction], List[ResultElement]]:
"""Run planning
data contain the service dict from json
redesign True means that network is redesign using each request as reference channel
when False it means that the design is made once and successive propagation use the settings
computed with this design.
"""
oms_list = build_oms_list(network, equipment)
rqs = requests_from_json(data, equipment)
# check that request ids are unique.
check_request_path_ids(rqs)
rqs = correct_json_route_list(network, rqs)
dsjn = disjunctions_from_json(data)
logger.info('List of disjunctions:\n%s', dsjn)
# need to warn or correct in case of wrong disjunction form
# disjunction must not be repeated with same or different ids
dsjn = deduplicate_disjunctions(dsjn)
logger.info('Aggregating similar requests')
rqs, dsjn = requests_aggregation(rqs, dsjn)
logger.info('The following services have been requested:\n%s', rqs)
# logger.info('Computing all paths with constraints for request %s', optical_path_result_id)
pths = compute_path_dsjctn(network, equipment, rqs, dsjn)
logger.info('Propagating on selected path')
propagatedpths, reversed_pths, reversed_propagatedpths = \
compute_path_with_disjunction(network, equipment, rqs, pths, redesign=redesign)
# Note that deepcopy used in compute_path_with_disjunction returns
# a list of nodes which are not belonging to network (they are copies of the node objects).
# so there can not be propagation on these nodes.
# Allowed user_policy are first_fit and 2partition
pth_assign_spectrum(pths, rqs, oms_list, reversed_pths)
for i, rq in enumerate(rqs):
if hasattr(rq, 'OSNR') and rq.OSNR:
rq.osnr_with_sys_margin = rq.OSNR + equipment["SI"]["default"].sys_margins
# assumes that list of rqs and list of propgatedpths have same order
result = [ResultElement(rq, pth, rpth) for rq, pth, rpth in zip(rqs, propagatedpths, reversed_propagatedpths)]
return oms_list, propagatedpths, reversed_propagatedpths, rqs, dsjn, result
def transmission_simulation(equipment: dict, network: DiGraph, req: PathRequest, ref_req: PathRequest) \
-> Tuple[list, List[list], List[Union[float, int]], SpectralInformation]:
"""Run simulation and returms the propagation result for each power sweep iteration.
Args:
- equipment: a dictionary containing equipment information.
- network: network after being designed using ref_req. Any missing information (amp gain or delta_p) must have
been filled using ref_req as reference channel previuos to this function.
- req: channel to be propagated.
- ref_req: the reference channel used for filling missing information in the network.
In case of power sweep, network is redesigned using ref_req whose target input power in span is
updated with the power step.
Returns a tuple containing:
- path: last propagated path. Power sweep is not possible with gain mode (as gain targets are used)
- propagations: list of propagated path for each power iteration
- powers_dbm: list of power used for the power sweep
- infos: last propagated spectral information
"""
power_mode = equipment['Span']['default'].power_mode
logger.info('Power mode is set to %s=> it can be modified in eqpt_config.json - Span', power_mode)
# initial network is designed using ref_req. that is that any missing information (amp gain or delta_p) is filled
# using this ref_req.power, previous to any sweep requested later on.
pref_ch_db = watt2dbm(ref_req.power)
p_ch_db = watt2dbm(req.power)
path = compute_constrained_path(network, req)
power_range = [0]
if power_mode:
# power cannot be changed in gain mode
try:
p_start, p_stop, p_step = equipment['SI']['default'].power_range_db
p_num = abs(int(round((p_stop - p_start) / p_step))) + 1 if p_step != 0 else 1
power_range = list(linspace(p_start, p_stop, p_num))
except TypeError as e:
msg = 'invalid power range definition in eqpt_config, should be power_range_db: [lower, upper, step]'
logger.error(msg)
raise exceptions.EquipmentConfigError(msg) from e
logger.info('Now propagating between %s and %s', req.source, req.destination)
propagations = []
powers_dbm = []
for dp_db in power_range:
ref_req.power = dbm2watt(pref_ch_db + dp_db)
req.power = dbm2watt(p_ch_db + dp_db)
# Power sweep is made to evaluate different span input powers, so redesign is mandatory for each power,
# but no need to redesign if there are no power sweep
if len(power_range) > 1:
design_network(ref_req, network.subgraph(path), equipment, set_connector_losses=False, verbose=False)
infos = propagate(path, req, equipment)
propagations.append(deepcopy(path))
powers_dbm.append(pref_ch_db + dp_db)
logger.info('\nChannels propagating: (Input optical power deviation in span = '
+ f'{pretty_summary_print(per_label_average(infos.delta_pdb_per_channel, infos.label))}dB,\n'
+ ' spacing = '
+ f'{pretty_summary_print(per_label_average(infos.slot_width * 1e-9, infos.label))}GHz,\n'
+ ' transceiver output power = '
+ f'{pretty_summary_print(per_label_average(watt2dbm(infos.tx_power), infos.label))}dBm,\n'
+ f' nb_channels = {infos.number_of_channels})')
if not power_mode:
logger.info('\n\tPropagating using gain targets: Input optical power deviation in span ignored')
return path, propagations, powers_dbm, infos

View File

@@ -16,14 +16,17 @@ See: draft-ietf-teas-yang-path-computation-01.txt
"""
from collections import namedtuple, OrderedDict
from typing import List
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, argmin
from gnpy.core.elements import Transceiver, Roadm
from gnpy.core.utils import lin2db
from gnpy.core.info import create_input_spectral_information, carriers_to_spectral_information
from gnpy.core.elements import Transceiver, Roadm, Edfa, Multiband_amplifier
from gnpy.core.utils import lin2db, unique_ordered, find_common_range
from gnpy.core.info import create_input_spectral_information, carriers_to_spectral_information, \
demuxed_spectral_information, muxed_spectral_information, SpectralInformation
from gnpy.core import network as network_module
from gnpy.core.exceptions import ServiceError, DisjunctionError
from copy import deepcopy
@@ -36,7 +39,7 @@ RequestParams = namedtuple('RequestParams', 'request_id source destination bidir
' trx_mode nodes_list loose_list spacing power nb_channel f_min'
' f_max format baud_rate OSNR penalties bit_rate'
' roll_off tx_osnr min_spacing cost path_bandwidth effective_freq_slot'
' equalization_offset_db')
' equalization_offset_db, tx_power')
DisjunctionParams = namedtuple('DisjunctionParams', 'disjunction_id relaxable link_diverse'
' node_diverse disjunctions_req')
@@ -65,6 +68,7 @@ class PathRequest:
self.bit_rate = params.bit_rate
self.roll_off = params.roll_off
self.tx_osnr = params.tx_osnr
self.tx_power = params.tx_power
self.min_spacing = params.min_spacing
self.cost = params.cost
self.path_bandwidth = params.path_bandwidth
@@ -96,6 +100,7 @@ class PathRequest:
f'bit_rate:\t{temp2} Gb/s',
f'spacing:\t{self.spacing * 1e-9} GHz',
f'power: \t{round(lin2db(self.power) + 30, 2)} dBm',
f'tx_power_dbm: \t{round(lin2db(self.tx_power) + 30, 2)} dBm',
f'nb channels: \t{self.nb_channel}',
f'path_bandwidth: \t{round(self.path_bandwidth * 1e-9, 2)} Gbit/s',
f'nodes-list:\t{self.nodes_list}',
@@ -296,7 +301,9 @@ def compute_constrained_path(network, req):
nodes_list = []
for node in req.nodes_list[:-1]:
nodes_list.append(next(el for el in network if el.uid == node))
total_path = explicit_path(nodes_list, source, destination, network)
if total_path is not None:
return total_path
try:
path_generator = shortest_simple_paths(network, source, destination, weight='weight')
total_path = next(path for path in path_generator if ispart(nodes_list, path))
@@ -330,25 +337,46 @@ def compute_constrained_path(network, req):
return total_path
def filter_si(path: list, equipment: dict, si: SpectralInformation) -> SpectralInformation:
"""Filter spectral information based on the amplifiers common range"""
# First retrieve f_min, f_max spectrum according to amplifiers' spectrum on the path
common_range = find_elements_common_range(path, equipment)
# filter out frequencies that should not be created
filtered_si = []
for band in common_range:
temp = demuxed_spectral_information(si, band)
if temp:
filtered_si.append(temp)
if not filtered_si:
raise ValueError('Defined propagation band does not match amplifiers band.')
return muxed_spectral_information(filtered_si)
def propagate(path, req, equipment):
"""propagates signals in each element according to initial spectrum set by user"""
"""propagates signals in each element according to initial spectrum set by user
Spectrum is specified in request through f_min, f_max and spacing, or initial_spectrum
and amps frequency band on the path is used to filter out frequencies"""
# generates spectrum based on request
if req.initial_spectrum is not None:
si = carriers_to_spectral_information(initial_spectrum=req.initial_spectrum, power=req.power)
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, delta_pdb=req.offset_db)
spacing=req.spacing, tx_osnr=req.tx_osnr, tx_power=req.tx_power, delta_pdb=req.offset_db)
# filter out frequencies that should not be created
si = filter_si(path, equipment, si)
roadm_osnr = []
for i, el in enumerate(path):
if isinstance(el, Roadm):
si = el(si, degree=path[i + 1].uid, from_degree=path[i - 1].uid)
roadm_osnr.append(el.get_impairment('roadm-osnr', si.frequency,
from_degree=path[i - 1].uid, degree=path[i + 1].uid))
else:
si = el(si)
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(si.tx_osnr, equipment['Roadm']['default'].add_drop_osnr)
else:
path[-1].update_snr(si.tx_osnr)
roadm_osnr.append(si.tx_osnr)
path[-1].update_snr(*roadm_osnr)
path[-1].calc_penalties(req.penalties)
return si
@@ -380,21 +408,26 @@ def propagate_and_optimize_mode(path, req, equipment):
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,
delta_pdb=this_offset, tx_osnr=req.tx_osnr)
baud_rate=this_br, spacing=req.spacing,
delta_pdb=this_offset, tx_osnr=req.tx_osnr,
tx_power=req.tx_power)
spc_info = filter_si(path, equipment, spc_info)
roadm_osnr = []
for i, el in enumerate(path):
if isinstance(el, Roadm):
spc_info = el(spc_info, degree=path[i + 1].uid, from_degree=path[i - 1].uid)
roadm_osnr.append(el.get_impairment('roadm-osnr', spc_info.frequency,
from_degree=path[i - 1].uid, degree=path[i + 1].uid))
else:
spc_info = el(spc_info)
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'])
roadm_osnr.append(this_mode['tx_osnr'])
path[-1].update_snr(*roadm_osnr)
# remove the tx_osnr from roadm_osnr list for the next iteration
del roadm_osnr[-1]
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:
@@ -966,6 +999,7 @@ def compare_reqs(req1, req2, disjlist):
req1.format == req2.format and \
req1.OSNR == req2.OSNR and \
req1.roll_off == req2.roll_off and \
req1.tx_power == req2.tx_power and \
same_disj:
return True
else:
@@ -1065,7 +1099,7 @@ def deduplicate_disjunctions(disjn):
return local_disjn
def compute_path_with_disjunction(network, equipment, pathreqlist, pathlist):
def compute_path_with_disjunction(network, equipment, pathreqlist, pathlist, redesign=False):
"""use a list but a dictionnary might be helpful to find path based on request_id
TODO change all these req, dsjct, res lists into dict !
@@ -1074,6 +1108,10 @@ def compute_path_with_disjunction(network, equipment, pathreqlist, pathlist):
reversed_path_res_list = []
propagated_reversed_path_res_list = []
total_nb_requests = len(pathreqlist)
if redesign:
LOGGER.warning('Redesign the network for each request channel, '
+ 'using the request channel as the reference channel for the design.')
for i, pathreq in enumerate(pathreqlist):
# use the power specified in requests but might be different from the one
@@ -1091,7 +1129,16 @@ def compute_path_with_disjunction(network, equipment, pathreqlist, pathlist):
# elements to simulate performance, several demands having the same destination
# may use the same transponder for the performance simulation. This is why
# we use deepcopy: to ensure that each propagation is recorded and not overwritten
network_module.design_network(pathreq, network, equipment, set_connector_losses=False, verbose=False)
# reversed path is needed for correct spectrum assignment
if redesign:
# this is the legacy case where network was automatically redesigned using the
# request channel as reference (nb and power used for amplifiers total power out)
reversed_path = []
if pathlist[i]:
reversed_path = find_reversed_path(pathlist[i])
network_nodes_for_redesign = pathlist[i] + reversed_path
network_module.design_network(pathreq, network.subgraph(network_nodes_for_redesign), equipment,
set_connector_losses=False, verbose=False)
total_path = deepcopy(pathlist[i])
msg = msg + f'\n\tComputed path (roadms):{[e.uid for e in total_path if isinstance(e, Roadm)]}'
LOGGER.info(msg)
@@ -1131,6 +1178,7 @@ def compute_path_with_disjunction(network, equipment, pathreqlist, pathlist):
pathreq.tx_osnr = mode['tx_osnr']
pathreq.bit_rate = mode['bit_rate']
pathreq.penalties = mode['penalties']
pathreq.offset_db = mode['equalization_offset_db']
# other blocking reason should not appear at this point
except AttributeError:
pathreq.baud_rate = mode['baud_rate']
@@ -1140,6 +1188,7 @@ def compute_path_with_disjunction(network, equipment, pathreqlist, pathlist):
pathreq.tx_osnr = mode['tx_osnr']
pathreq.bit_rate = mode['bit_rate']
pathreq.penalties = mode['penalties']
pathreq.offset_db = mode['equalization_offset_db']
# reversed path is needed for correct spectrum assignment
reversed_path = find_reversed_path(pathlist[i])
@@ -1206,3 +1255,49 @@ def _penalty_msg(total_path, msg, min_ind):
else:
msg += f'\n\t{pretty} penalty not evaluated'
return msg
def is_adjacent(oms1, oms2):
""" oms1's egress ROADM is oms2's ingress ROADM
"""
return oms1.el_list[-1] == oms2.el_list[0]
def explicit_path(node_list, source, destination, network):
""" if list of nodes leads to adjacent oms, then means that the path is explicit, and no need to compute
the function returns the explicit path (including source and destination ROADMs)
"""
path_oms = []
for elem in node_list:
if hasattr(elem, 'oms'):
path_oms.append(elem.oms)
if not path_oms:
return None
path_oms = unique_ordered(path_oms)
try:
next_node = next(network.successors(source))
source_roadm = next_node if isinstance(next_node, Roadm) else source
previous_node = next(network.predecessors(destination))
destination_roadm = previous_node if isinstance(previous_node, Roadm) else destination
if not (path_oms[0].el_list[0] == source_roadm and path_oms[-1].el_list[-1] == destination_roadm):
return None
except StopIteration:
return None
oms0 = path_oms[0]
path = [source] + oms0.el_list
for oms in path_oms[1:]:
if not is_adjacent(oms0, oms):
return None
oms0 = oms
path.extend(oms.el_list)
path.append(destination)
return unique_ordered(path)
def find_elements_common_range(el_list: list, equipment: dict) -> List[dict]:
"""Find the common frequency range of amps of a given list of elements (for example an OMS or a path)
If there are no amplifiers in the path, then use the SI
"""
amp_bands = [n.params.bands for n in el_list if isinstance(n, (Edfa, Multiband_amplifier))]
return find_common_range(amp_bands, equipment['SI']['default'].f_min, equipment['SI']['default'].f_max)

View File

@@ -15,28 +15,31 @@ element/oms correspondace
from collections import namedtuple
from logging import getLogger
from gnpy.core.elements import Roadm, Transceiver
from gnpy.core.elements import Roadm, Transceiver, Edfa, Multiband_amplifier
from gnpy.core.exceptions import ServiceError, SpectrumError
from gnpy.core.utils import order_slots, restore_order
from gnpy.topology.request import compute_spectrum_slot_vs_bandwidth
from gnpy.topology.request import compute_spectrum_slot_vs_bandwidth, find_elements_common_range
LOGGER = getLogger(__name__)
GUARDBAND = 25e9
class Bitmap:
"""records the spectrum occupation"""
def __init__(self, f_min, f_max, grid, guardband=0.15e12, bitmap=None):
# n is the min index including guardband. Guardband is require to be sure
def __init__(self, f_min, f_max, grid, guardband=GUARDBAND, bitmap=None):
# n is the min index including guardband. Guardband is required to be sure
# that a channel can be assigned with center frequency fmin (means that its
# slot occupation goes below freq_index_min
n_min = frequency_to_n(f_min - guardband, grid)
n_max = frequency_to_n(f_max + guardband, grid) - 1
n_min = frequency_to_n(f_min, grid)
n_max = frequency_to_n(f_max, grid)
self.n_min = n_min
self.n_max = n_max
self.freq_index_min = frequency_to_n(f_min)
self.freq_index_max = frequency_to_n(f_max)
self.freq_index_min = frequency_to_n(f_min + guardband)
self.freq_index_max = frequency_to_n(f_max - guardband)
self.freq_index = list(range(n_min, n_max + 1))
self.guardband = guardband
if bitmap is None:
self.bitmap = [1] * (n_max - n_min + 1)
elif len(bitmap) == len(self.freq_index):
@@ -83,7 +86,6 @@ class OMS:
self.spectrum_bitmap = []
self.nb_channels = 0
self.service_list = []
# TODO
def __str__(self):
return '\n\t'.join([f'{type(self).__name__} {self.oms_id}',
@@ -98,7 +100,7 @@ class OMS:
self.el_id_list.append(elem.uid)
self.el_list.append(elem)
def update_spectrum(self, f_min, f_max, guardband=0.15e12, existing_spectrum=None, grid=0.00625e12):
def update_spectrum(self, f_min, f_max, guardband=GUARDBAND, existing_spectrum=None, grid=0.00625e12):
"""Frequencies expressed in Hz.
Add 150 GHz margin to enable a center channel on f_min
Use ITU-T G694.1 Flexible DWDM grid definition
@@ -226,6 +228,40 @@ def align_grids(oms_list):
return oms_list
def find_network_freq_range(network, equipment):
"""Find the lowest freq from amps and highest freq among all amps to determine the resulting bitmap
"""
amp_bands = [band for n in network.nodes() if isinstance(n, (Edfa, Multiband_amplifier)) for band in n.params.bands]
min_frequencies = [a['f_min'] for a in amp_bands]
max_frequencies = [a['f_max'] for a in amp_bands]
return min(min_frequencies), max(max_frequencies)
def create_oms_bitmap(oms, equipment, f_min, f_max, guardband, grid):
"""Find the highest low freq from oms amps and lowest high freq among oms amps to determine
the possible bitmap window.
f_min and f_max represent the useable spectrum (not the useable center frequencies)
ie n smaller than frequency_to_n(min_freq, grid) are not useable
"""
n_min = frequency_to_n(f_min, grid)
n_max = frequency_to_n(f_max, grid) - 1
common_range = find_elements_common_range(oms.el_list, equipment)
band0 = common_range[0]
band0_n_min = frequency_to_n(band0['f_min'], grid)
band0_n_max = frequency_to_n(band0['f_max'], grid)
bitmap = [0] * (band0_n_min - n_min) + [1] * (band0_n_max - band0_n_min + 1)
i = 1
while i < len(common_range):
band = common_range[i]
band_n_min = frequency_to_n(band['f_min'], grid)
band_n_max = frequency_to_n(band['f_max'], grid)
bitmap = bitmap + [0] * (band_n_min - band0_n_max - 1) + [1] * (band_n_max - band_n_min + 1)
band0_n_max = band_n_max
i += 1
bitmap = bitmap + [0] * (n_max - band0_n_max)
return bitmap
def build_oms_list(network, equipment):
"""initialization of OMS list in the network
@@ -237,7 +273,15 @@ def build_oms_list(network, equipment):
"""
oms_id = 0
oms_list = []
for node in [n for n in network.nodes() if isinstance(n, Roadm)]:
# identify all vertices of OMS: of course ROADM, but aso links to external chassis transponders
oms_vertices = [n for n in network.nodes() if isinstance(n, Roadm)] +\
[n for n in network.nodes() if isinstance(n, Transceiver)
and not isinstance(next(network.successors(n)), Roadm)]
# determine the size of the bitmap common to all the omses: find min and max frequencies of all amps
# in the network. These gives the band not the center frequency. Thhen we use a reference channel
# slot width (50GHz) to set the f_min, f_max
f_min, f_max = find_network_freq_range(network, equipment)
for node in oms_vertices:
for edge in network.edges([node]):
if not isinstance(edge[1], Transceiver):
nd_in = edge[0] # nd_in is a Roadm
@@ -271,8 +315,9 @@ def build_oms_list(network, equipment):
nd_out.oms_list = []
nd_out.oms_list.append(oms_id)
oms.update_spectrum(equipment['SI']['default'].f_min,
equipment['SI']['default'].f_max, grid=0.00625e12)
bitmap = create_oms_bitmap(oms, equipment, f_min=f_min, f_max=f_max, guardband=GUARDBAND,
grid=0.00625e12)
oms.update_spectrum(f_min, f_max, guardband=GUARDBAND, grid=0.00625e12, existing_spectrum=bitmap)
# oms.assign_spectrum(13,7) gives back (193137500000000.0, 193225000000000.0)
# as in the example in the standard
# oms.assign_spectrum(13,7)
@@ -333,10 +378,11 @@ def aggregate_oms_bitmap(path_oms, oms_list):
'el_id_list': 0,
'el_list': []
}
freq_min = nvalue_to_frequency(spectrum.freq_index_min)
freq_max = nvalue_to_frequency(spectrum.freq_index_max)
freq_min = nvalue_to_frequency(spectrum.n_min)
freq_max = nvalue_to_frequency(spectrum.n_max)
aggregate_oms = OMS(**params)
aggregate_oms.update_spectrum(freq_min, freq_max, grid=0.00625e12, existing_spectrum=bitmap)
aggregate_oms.update_spectrum(freq_min, freq_max, grid=0.00625e12, guardband=spectrum.guardband,
existing_spectrum=bitmap)
return aggregate_oms

View File

@@ -1,559 +0,0 @@
*********************************************
Equipment and Network description definitions
*********************************************
1. Equipment description
########################
Equipment description defines equipment types and those parameters.
Description is made in JSON file with predefined structure. By default
**gnpy-transmission-example** uses **eqpt_config.json** file and that
can be changed with **-e** or **--equipment** command line parameter.
Parsing of JSON file is made with
**gnpy.core.equipment.load_equipment(equipment_description)** and return
value is a dictionary of format **dict[equipment
type][subtype]=object**
1.1. Structure definition
*************************
1.1.1. Equipment types
*************************
Every equipment type is defined in JSON root with according name and
array of parameters as value.
.. code-block:: none
{"Edfa": [...],
"Fiber": [...]
}
1.1.2. Equipment parameters and subtypes
*****************************************
Array of parameters is a list of objects with unordered parameter name
and its value definition. In case of multiple equipment subtypes each
object contains **"type_variety":”type name”** name:value combination,
if only one subtype exists **"type_variety"** name is not mandatory and
it will be marked with **”default”** value.
.. code-block:: json
{"Edfa": [{
"type_variety": "std_medium_gain",
"type_def": "variable_gain",
"gain_flatmax": 26,
"gain_min": 15,
"p_max": 23,
"nf_min": 6,
"nf_max": 10,
"out_voa_auto": false,
"allowed_for_design": true
},
{
"type_variety": "std_low_gain",
"type_def": "variable_gain",
"gain_flatmax": 16,
"gain_min": 8,
"p_max": 23,
"nf_min": 6.5,
"nf_max": 11,
"out_voa_auto": false,
"allowed_for_design": true
}
],
"Fiber": [{
"type_variety": "SSMF",
"dispersion": 1.67e-05,
"gamma": 0.00127
}
]
}
1.2. Equipment parameters by type
*********************************
1.2.1. EDFA element
*******************
Four types of EDFA definition are possible. Description JSON file
location is in **gnpy-transmission-example** folder:
- Advanced with JSON file describing gain/noise figure tilt and
gain/noise figure ripple. **"advanced_config_from_json"** value
contains filename.
.. code-block:: json-object
"Edfa":[{
"type_variety": "high_detail_model_example",
"gain_flatmax": 25,
"gain_min": 15,
"p_max": 21,
"advanced_config_from_json": "std_medium_gain_advanced_config.json",
"out_voa_auto": false,
"allowed_for_design": false
}
]
- Variable gain with JSON file describing gain figure tilt and gain/noise
figure ripple. **”default_edfa_config.json”** as source file.
.. code-block:: json-object
"Edfa":[{
"type_variety": "std_medium_gain",
"type_def": "variable_gain",
"gain_flatmax": 26,
"gain_min": 15,
"p_max": 23,
"nf_min": 6,
"nf_max": 10,
"out_voa_auto": false,
"allowed_for_design": true
}
]
- Fixed gain with JSON file describing gain figure tilt and gain/noise
figure ripple. **”default_edfa_config.json”** as source file.
.. code-block:: json-object
"Edfa":[{
"type_variety": "std_fixed_gain",
"type_def": "fixed_gain",
"gain_flatmax": 21,
"gain_min": 20,
"p_max": 21,
"nf0": 5.5,
"allowed_for_design": false
}
]
- openroadm with JSON file describing gain figure tilt and gain/noise
figure ripple. **”default_edfa_config.json”** as source file.
.. code-block:: json-object
"Edfa":[{
"type_variety": "openroadm_ila_low_noise",
"type_def": "openroadm",
"gain_flatmax": 27,
"gain_min": 12,
"p_max": 22,
"nf_coef": [-8.104e-4,-6.221e-2,-5.889e-1,37.62],
"allowed_for_design": false
}
]
1.2.2. Fiber element
********************
Fiber element with its parameters:
.. code-block:: json-object
"Fiber":[{
"type_variety": "SSMF",
"dispersion": 1.67e-05,
"gamma": 0.00127
}
]
RamanFiber element
******************
A special variant of the regular ``Fiber`` where the simulation engine accounts for the Raman effect.
The newly added parameters are nested in the ``raman_efficiency`` dictionary.
Its shape corresponds to typical properties of silica.
More details are available from :cite:`curri_merit_2016`.
The ``cr`` property is the normailzed Raman efficiency, so it is is (almost) independent of the fiber type, while the coefficient actually giving Raman gain is g_R=C_R/Aeff.
The ``frequency_offset`` represents the spectral difference between the pumping photon and the one receiving energy.
.. code-block:: json-object
"RamanFiber":[{
"type_variety": "SSMF",
"dispersion": 1.67e-05,
"gamma": 0.00127,
"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
]
}
}
]
1.2.3 Roadm element
*******************
Roadm element with its parameters:
.. code-block:: json-object
"Roadms":[{
"gain_mode_default_loss": 20,
"power_mode_pout_target": -20,
"add_drop_osnr": 38
}
]
1.2.3. Spans element
********************
Spans element with its parameters:
.. code-block:: json-object
"Spans":[{
"power_mode":true,
"delta_power_range_db": [0,0,0.5],
"max_length": 150,
"length_units": "km",
"max_loss": 28,
"padding": 10,
"EOL": 0,
"con_in": 0,
"con_out": 0
}
]
1.2.4. Spectral Information
***************************
Spectral information with its parameters:
.. code-block:: json-object
"SI":[{
"f_min": 191.3e12,
"baud_rate": 32e9,
"f_max":195.1e12,
"spacing": 50e9,
"power_dbm": 0,
"power_range_db": [0,0,0.5],
"roll_off": 0.15,
"tx_osnr": 40,
"sys_margins": 0
}
]
1.2.5. Transceiver element
**************************
Transceiver element with its parameters. **”mode”** can contain multiple
Transceiver operation formats.
Note that ``OSNR`` parameter refers to the receiver's minimal OSNR threshold for a given mode.
.. code-block:: json-object
"Transceiver":[{
"frequency":{
"min": 191.35e12,
"max": 196.1e12
},
"mode":[
{
"format": "mode 1",
"baud_rate": 32e9,
"OSNR": 11,
"bit_rate": 100e9,
"roll_off": 0.15,
"tx_osnr": 40,
"min_spacing": 37.5e9,
"cost":1
},
{
"format": "mode 2",
"baud_rate": 66e9,
"OSNR": 15,
"bit_rate": 200e9,
"roll_off": 0.15,
"tx_osnr": 40,
"min_spacing": 75e9,
"cost":1
}
]
}
]
***********************
2. Network description
***********************
Network description defines network elements with additional to
equipment description parameters, metadata and elements interconnection.
Description is made in JSON file with predefined structure. By default
**gnpy-transmission-example** uses **edfa_example_network.json** file
and can be changed from command line. Parsing of JSON file is made with
**gnpy.core.network.load_network(network_description,
equipment_description)** and return value is **DiGraph** object which
mimics network description.
2.1. Structure definition
##########################
2.1.1. File root structure
***************************
Network description JSON file root consist of three unordered parts:
- network_name name of described network or service, is not used as
of now
- elements - contains array of network element objects with their
respective parameters
- connections contains array of unidirectional connection objects
.. code-block:: none
{"network_name": "Example Network",
"elements": [{...},
{...}
],
"connections": [{...},
{...}
]
}
2.1.2. Elements parameters and subtypes
****************************************
Array of network element objects consist of unordered parameter names
and those values. In case of **"type_variety"** absence
**"type_variety":”default”** name:value combination is used. As of the
moment, existence of used **"type_variety"** in equipment description is
obligatory.
2.2. Element parameters by type
*********************************
2.2.1. Transceiver element
***************************
Transceiver element with its parameters.
.. code-block:: json
{"uid": "trx Site_A",
"metadata": {
"location": {
"city": "Site_A",
"region": "",
"latitude": 0,
"longitude": 0
}
},
"type": "Transceiver"
}
2.2.2. ROADM element
*********************
ROADM element with its parameters. **“params”** is optional, if not used
default loss value of 20dB is used.
.. code-block:: json
{"uid": "roadm Site_A",
"metadata": {
"location": {
"city": "Site_A",
"region": "",
"latitude": 0,
"longitude": 0
}
},
"type": "Roadm",
"params": {
"loss": 17
}
}
2.2.3. Fused element
*********************
Fused element with its parameters. **“params”** is optional, if not used
default loss value of 1dB is used.
.. code-block:: json
{"uid": "ingress fused spans in Site_B",
"metadata": {
"location": {
"city": "Site_B",
"region": "",
"latitude": 0,
"longitude": 0
}
},
"type": "Fused",
"params": {
"loss": 0.5
}
}
2.2.4. Fiber element
*********************
Fiber element with its parameters.
.. code-block:: json
{"uid": "fiber (Site_A \\u2192 Site_B)",
"metadata": {
"location": {
"city": "",
"region": "",
"latitude": 0.0,
"longitude": 0.0
}
},
"type": "Fiber",
"type_variety": "SSMF",
"params": {
"length": 40.0,
"length_units": "km",
"loss_coef": 0.2
}
}
2.2.5. RamanFiber element
*************************
.. code-block:: json
{
"uid": "Span1",
"type": "RamanFiber",
"type_variety": "SSMF",
"operational": {
"temperature": 283,
"raman_pumps": [
{
"power": 200e-3,
"frequency": 205e12,
"propagation_direction": "counterprop"
},
{
"power": 206e-3,
"frequency": 201e12,
"propagation_direction": "counterprop"
}
]
},
"params": {
"type_variety": "SSMF",
"length": 80.0,
"loss_coef": 0.2,
"length_units": "km",
"att_in": 0,
"con_in": 0.5,
"con_out": 0.5
},
"metadata": {
"location": {
"latitude": 1,
"longitude": 0,
"city": null,
"region": ""
}
}
}
2.2.6. EDFA element
********************
EDFA element with its parameters.
.. code-block:: json
{"uid": "Edfa1",
"type": "Edfa",
"type_variety": "std_low_gain",
"operational": {
"gain_target": 16,
"tilt_target": 0
},
"metadata": {
"location": {
"city": "Site_A",
"region": "",
"latitude": 2,
"longitude": 0
}
}
}
2.3. Connections objects
*************************
Each unidirectional connection object in connections array consist of
two unordered **”from_node”** and **”to_node”** name pair with values
corresponding to element **”uid”**
.. code-block:: json
{"from_node": "roadm Site_C",
"to_node": "trx Site_C"
}
************************
3. Simulation Parameters
************************
Additional details of the simulation are controlled via ``sim_params.json``:
.. code-block:: json
{
"raman_parameters": {
"flag_raman": true,
"space_resolution": 10e3,
"tolerance": 1e-8
},
"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]
}
}

View File

@@ -1203,6 +1203,7 @@
{
"uid": "roadm Abilene",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -1226,6 +1227,7 @@
{
"uid": "roadm Albany",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -1249,6 +1251,7 @@
{
"uid": "roadm Albuquerque",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -1274,6 +1277,7 @@
{
"uid": "roadm Atlanta",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -1298,6 +1302,7 @@
{
"uid": "roadm Austin",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -1321,6 +1326,7 @@
{
"uid": "roadm Baltimore",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -1345,6 +1351,7 @@
{
"uid": "roadm Baton_Rouge",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -1368,6 +1375,7 @@
{
"uid": "roadm Billings",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -1392,6 +1400,7 @@
{
"uid": "roadm Birmingham",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -1416,6 +1425,7 @@
{
"uid": "roadm Bismarck",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -1439,6 +1449,7 @@
{
"uid": "roadm Boston",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -1462,6 +1473,7 @@
{
"uid": "roadm Buffalo",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -1485,6 +1497,7 @@
{
"uid": "roadm Charleston",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -1508,6 +1521,7 @@
{
"uid": "roadm Charlotte",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -1531,6 +1545,7 @@
{
"uid": "roadm Chicago",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -1555,6 +1570,7 @@
{
"uid": "roadm Cincinnati",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -1579,6 +1595,7 @@
{
"uid": "roadm Cleveland",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -1603,6 +1620,7 @@
{
"uid": "roadm Columbus",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -1627,6 +1645,7 @@
{
"uid": "roadm Dallas",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -1653,6 +1672,7 @@
{
"uid": "roadm Denver",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -1678,6 +1698,7 @@
{
"uid": "roadm Detroit",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -1701,6 +1722,7 @@
{
"uid": "roadm El_Paso",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -1726,6 +1748,7 @@
{
"uid": "roadm Fresno",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -1750,6 +1773,7 @@
{
"uid": "roadm Greensboro",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -1775,6 +1799,7 @@
{
"uid": "roadm Hartford",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -1798,6 +1823,7 @@
{
"uid": "roadm Houston",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -1822,6 +1848,7 @@
{
"uid": "roadm Jacksonville",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -1846,6 +1873,7 @@
{
"uid": "roadm Kansas_City",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -1870,6 +1898,7 @@
{
"uid": "roadm Las_Vegas",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -1895,6 +1924,7 @@
{
"uid": "roadm Little_Rock",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -1918,6 +1948,7 @@
{
"uid": "roadm Long_Island",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -1941,6 +1972,7 @@
{
"uid": "roadm Los_Angeles",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -1966,6 +1998,7 @@
{
"uid": "roadm Louisville",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -1991,6 +2024,7 @@
{
"uid": "roadm Memphis",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -2014,6 +2048,7 @@
{
"uid": "roadm Miami",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -2038,6 +2073,7 @@
{
"uid": "roadm Milwaukee",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -2061,6 +2097,7 @@
{
"uid": "roadm Minneapolis",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -2085,6 +2122,7 @@
{
"uid": "roadm Nashville",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -2109,6 +2147,7 @@
{
"uid": "roadm New_Orleans",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -2133,6 +2172,7 @@
{
"uid": "roadm New_York",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -2159,6 +2199,7 @@
{
"uid": "roadm Newark",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -2182,6 +2223,7 @@
{
"uid": "roadm Norfolk",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -2205,6 +2247,7 @@
{
"uid": "roadm Oakland",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -2231,6 +2274,7 @@
{
"uid": "roadm Oklahoma_City",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -2254,6 +2298,7 @@
{
"uid": "roadm Omaha",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -2278,6 +2323,7 @@
{
"uid": "roadm Orlando",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -2301,6 +2347,7 @@
{
"uid": "roadm Philadelphia",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -2325,6 +2372,7 @@
{
"uid": "roadm Phoenix",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -2349,6 +2397,7 @@
{
"uid": "roadm Pittsburgh",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -2373,6 +2422,7 @@
{
"uid": "roadm Portland",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -2398,6 +2448,7 @@
{
"uid": "roadm Providence",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -2421,6 +2472,7 @@
{
"uid": "roadm Raleigh",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -2445,6 +2497,7 @@
{
"uid": "roadm Richmond",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -2468,6 +2521,7 @@
{
"uid": "roadm Rochester",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -2491,6 +2545,7 @@
{
"uid": "roadm Sacramento",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -2514,6 +2569,7 @@
{
"uid": "roadm Salt_Lake_City",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -2539,6 +2595,7 @@
{
"uid": "roadm San_Antonio",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -2562,6 +2619,7 @@
{
"uid": "roadm San_Diego",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -2585,6 +2643,7 @@
{
"uid": "roadm San_Francisco",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -2608,6 +2667,7 @@
{
"uid": "roadm San_Jose",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -2631,6 +2691,7 @@
{
"uid": "roadm Santa_Barbara",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -2654,6 +2715,7 @@
{
"uid": "roadm Scranton",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -2679,6 +2741,7 @@
{
"uid": "roadm Seattle",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -2702,6 +2765,7 @@
{
"uid": "roadm Spokane",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -2725,6 +2789,7 @@
{
"uid": "roadm Springfield",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -2748,6 +2813,7 @@
{
"uid": "roadm St_Louis",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -2772,6 +2838,7 @@
{
"uid": "roadm Syracuse",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -2796,6 +2863,7 @@
{
"uid": "roadm Tallahassee",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -2819,6 +2887,7 @@
{
"uid": "roadm Tampa",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -2842,6 +2911,7 @@
{
"uid": "roadm Toledo",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -2865,6 +2935,7 @@
{
"uid": "roadm Tucson",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -2888,6 +2959,7 @@
{
"uid": "roadm Tulsa",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -2911,6 +2983,7 @@
{
"uid": "roadm Washington_DC",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -2936,6 +3009,7 @@
{
"uid": "roadm West_Palm_Beach",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -2959,6 +3033,7 @@
{
"uid": "roadm Wilmington",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -2982,6 +3057,7 @@
{
"uid": "roadm Amsterdam",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -3007,6 +3083,7 @@
{
"uid": "roadm Berlin",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -3030,6 +3107,7 @@
{
"uid": "roadm Brussels",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -3053,6 +3131,7 @@
{
"uid": "roadm Bucharest",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -3076,6 +3155,7 @@
{
"uid": "roadm Frankfurt",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -3099,6 +3179,7 @@
{
"uid": "roadm Istanbul",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -3123,6 +3204,7 @@
{
"uid": "roadm London",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -3147,6 +3229,7 @@
{
"uid": "roadm Madrid",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -3170,6 +3253,7 @@
{
"uid": "roadm Paris",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -3194,6 +3278,7 @@
{
"uid": "roadm Rome",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -3219,6 +3304,7 @@
{
"uid": "roadm Vienna",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -3243,6 +3329,7 @@
{
"uid": "roadm Warsaw",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -3267,6 +3354,7 @@
{
"uid": "roadm Zurich",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -3290,6 +3378,7 @@
{
"uid": "roadm Bangkok",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -3313,6 +3402,7 @@
{
"uid": "roadm Beijing",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -3336,6 +3426,7 @@
{
"uid": "roadm Delhi",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -3360,6 +3451,7 @@
{
"uid": "roadm Hong_Kong",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -3385,6 +3477,7 @@
{
"uid": "roadm Honolulu",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -3409,6 +3502,7 @@
{
"uid": "roadm Mumbai",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -3433,6 +3527,7 @@
{
"uid": "roadm Seoul",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -3456,6 +3551,7 @@
{
"uid": "roadm Shanghai",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -3479,6 +3575,7 @@
{
"uid": "roadm Singapore",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -3502,6 +3599,7 @@
{
"uid": "roadm Sydney",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -3526,6 +3624,7 @@
{
"uid": "roadm Taipei",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -3551,6 +3650,7 @@
{
"uid": "roadm Tokyo",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {

View File

@@ -0,0 +1,31 @@
{
"nf_ripple": [
0.0
],
"gain_ripple": [
0.0
],
"f_min": 191.275e12,
"f_max": 196.125e12,
"dgt": [
1.0, 1.017807767853702, 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

@@ -1,298 +0,0 @@
{
"f_min": 191.35e12,
"f_max": 196.1e12,
"nf_ripple": [
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
],
"gain_ripple": [
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
],
"dgt": [
1.0,
1.017807767853702,
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

@@ -1,4 +1,5 @@
{ "Edfa":[{
{
"Edfa": [{
"type_variety": "CienaDB_medium_gain",
"type_def": "advanced_model",
"gain_flatmax": 25,
@@ -7,8 +8,7 @@
"advanced_config_from_json": "std_medium_gain_advanced_config.json",
"out_voa_auto": false,
"allowed_for_design": true
},
{
}, {
"type_variety": "std_medium_gain",
"type_def": "variable_gain",
"gain_flatmax": 26,
@@ -18,8 +18,7 @@
"nf_max": 10,
"out_voa_auto": false,
"allowed_for_design": true
},
{
}, {
"type_variety": "std_low_gain",
"type_def": "variable_gain",
"gain_flatmax": 16,
@@ -29,8 +28,7 @@
"nf_max": 11,
"out_voa_auto": false,
"allowed_for_design": true
},
{
}, {
"type_variety": "test",
"type_def": "variable_gain",
"gain_flatmax": 25,
@@ -40,8 +38,7 @@
"nf_max": 10,
"out_voa_auto": false,
"allowed_for_design": true
},
{
}, {
"type_variety": "test_fixed_gain",
"type_def": "fixed_gain",
"gain_flatmax": 21,
@@ -49,8 +46,7 @@
"p_max": 21,
"nf0": 5,
"allowed_for_design": true
},
{
}, {
"type_variety": "std_booster",
"type_def": "fixed_gain",
"gain_flatmax": 21,
@@ -82,6 +78,92 @@
}
],
"Roadm": [{
"type_variety": "example_test",
"target_pch_out_db": -18,
"add_drop_osnr": 35,
"pmd": 1e-12,
"pdl": 0.5,
"restrictions": {
"preamp_variety_list": [],
"booster_variety_list": []
},
"roadm-path-impairments": []
}, {
"type_variety": "example_detailed_impairments",
"target_pch_out_db": -20,
"add_drop_osnr": 35,
"pmd": 0,
"pdl": 0,
"restrictions": {
"preamp_variety_list":[],
"booster_variety_list":[]
},
"roadm-path-impairments": [
{
"roadm-path-impairments-id": 0,
"roadm-express-path": [{
"frequency-range": {
"lower-frequency": 191.3e12,
"upper-frequency": 196.1e12
},
"roadm-pmd": 0,
"roadm-cd": 0,
"roadm-pdl": 0,
"roadm-inband-crosstalk": 0,
"roadm-maxloss": 16.5
}
]
}, {
"roadm-path-impairments-id": 1,
"roadm-add-path": [{
"frequency-range": {
"lower-frequency": 191.3e12,
"upper-frequency": 196.1e12
},
"roadm-pmd": 0,
"roadm-cd": 0,
"roadm-pdl": 0,
"roadm-inband-crosstalk": 0,
"roadm-maxloss": 11.5,
"roadm-pmax": 2.5,
"roadm-osnr": 41,
"roadm-noise-figure": 23
}, {
"frequency-range": {
"lower-frequency": 186.3e12,
"upper-frequency": 190.1e12
},
"roadm-pmd": 0,
"roadm-cd": 0,
"roadm-pdl": 0.5,
"roadm-inband-crosstalk": 0,
"roadm-maxloss": 5,
"roadm-pmax": 0,
"roadm-osnr": 35,
"roadm-noise-figure": 6
}]
}, {
"roadm-path-impairments-id": 2,
"roadm-drop-path": [{
"frequency-range": {
"lower-frequency": 191.3e12,
"upper-frequency": 196.1e12
},
"roadm-pmd": 0,
"roadm-cd": 0,
"roadm-pdl": 0,
"roadm-inband-crosstalk": 0,
"roadm-maxloss": 11.5,
"roadm-minloss": 7.5,
"roadm-typloss": 10,
"roadm-pmin": -13.5,
"roadm-pmax": -9.5,
"roadm-ptyp": -12,
"roadm-osnr": 41,
"roadm-noise-figure": 15
}]
}]
}, {
"target_pch_out_db": -20,
"add_drop_osnr": 38,
"pmd": 0,
@@ -90,8 +172,10 @@
"preamp_variety_list": [],
"booster_variety_list": []
}
}],
}
],
"SI": [{
"type_variety": "default",
"f_min": 191.3e12,
"f_max": 196.1e12,
"baud_rate": 32e9,
@@ -109,8 +193,7 @@
"min": 191.35e12,
"max": 196.1e12
},
"mode":[
{
"mode": [{
"format": "PS_SP64_1",
"baud_rate": 32e9,
"OSNR": 11,
@@ -119,8 +202,7 @@
"tx_osnr": 100,
"min_spacing": 50e9,
"cost": 1
},
{
}, {
"format": "PS_SP64_2",
"baud_rate": 64e9,
"OSNR": 15,
@@ -129,8 +211,7 @@
"tx_osnr": 100,
"min_spacing": 75e9,
"cost": 1
},
{
}, {
"format": "mode 1",
"baud_rate": 32e9,
"OSNR": 11,
@@ -139,8 +220,7 @@
"tx_osnr": 100,
"min_spacing": 50e9,
"cost": 1
},
{
}, {
"format": "mode 2",
"baud_rate": 64e9,
"OSNR": 15,
@@ -151,15 +231,13 @@
"cost": 1
}
]
},
{
}, {
"type_variety": "Voyager_16QAM",
"frequency": {
"min": 191.35e12,
"max": 196.1e12
},
"mode":[
{
"mode": [{
"format": "16QAM",
"baud_rate": 32e9,
"OSNR": 19,
@@ -170,15 +248,13 @@
"cost": 1
}
]
},
{
}, {
"type_variety": "Voyager",
"frequency": {
"min": 191.35e12,
"max": 196.1e12
},
"mode":[
{
"mode": [{
"format": "mode 1",
"baud_rate": 32e9,
"OSNR": 12,
@@ -187,8 +263,7 @@
"tx_osnr": 45,
"min_spacing": 50e9,
"cost": 1
},
{
}, {
"format": "mode 3",
"baud_rate": 44e9,
"OSNR": 18,
@@ -197,8 +272,7 @@
"tx_osnr": 45,
"min_spacing": 62.5e9,
"cost": 1
},
{
}, {
"format": "mode 2",
"baud_rate": 66e9,
"OSNR": 21,
@@ -207,8 +281,7 @@
"tx_osnr": 45,
"min_spacing": 75e9,
"cost": 1
},
{
}, {
"format": "mode 2 - fake",
"baud_rate": 66e9,
"OSNR": 21,
@@ -217,8 +290,7 @@
"tx_osnr": 45,
"min_spacing": 75e9,
"cost": 1
},
{
}, {
"format": "mode 4",
"baud_rate": 66e9,
"OSNR": 16,
@@ -231,5 +303,4 @@
]
}
]
}

View File

@@ -0,0 +1,396 @@
{ "Edfa":[{
"type_variety": "CienaDB_medium_gain",
"type_def": "advanced_model",
"gain_flatmax": 25,
"gain_min": 15,
"p_max": 21,
"advanced_config_from_json": "std_medium_gain_advanced_config.json",
"out_voa_auto": false,
"allowed_for_design": true
},
{
"type_variety": "std_medium_gain",
"f_min": 191.25e12,
"f_max": 196.15e12,
"type_def": "variable_gain",
"gain_flatmax": 26,
"gain_min": 15,
"p_max": 21,
"nf_min": 6,
"nf_max": 10,
"out_voa_auto": false,
"allowed_for_design": true
},
{
"type_variety": "std_medium_gain_L",
"f_min": 186.55e12,
"f_max": 190.05e12,
"type_def": "variable_gain",
"gain_flatmax": 26,
"gain_min": 15,
"p_max": 21,
"nf_min": 6,
"nf_max": 10,
"out_voa_auto": false,
"allowed_for_design": true
},
{
"type_variety": "std_low_gain",
"f_min": 191.25e12,
"f_max": 196.15e12,
"type_def": "variable_gain",
"gain_flatmax": 16,
"gain_min": 8,
"p_max": 21,
"nf_min": 7,
"nf_max": 11,
"out_voa_auto": false,
"allowed_for_design": true
},
{
"type_variety": "std_low_gain_reduced_band",
"f_min": 192.25e12,
"f_max": 196.15e12,
"type_def": "variable_gain",
"gain_flatmax": 16,
"gain_min": 8,
"p_max": 21,
"nf_min": 7,
"nf_max": 11,
"out_voa_auto": false,
"allowed_for_design": true
},
{
"type_variety": "std_low_gain_reduced",
"f_min": 192.25e12,
"f_max": 196.15e12,
"type_def": "variable_gain",
"gain_flatmax": 16,
"gain_min": 8,
"p_max": 21,
"nf_min": 7,
"nf_max": 11,
"out_voa_auto": false,
"allowed_for_design": true
},
{
"type_variety": "std_low_gain_bis",
"f_min": 191.25e12,
"f_max": 196.15e12,
"type_def": "variable_gain",
"gain_flatmax": 16,
"gain_min": 8,
"p_max": 21,
"nf_min": 6,
"nf_max": 10,
"out_voa_auto": false,
"allowed_for_design": true
}, {
"type_variety": "std_low_gain_L_ter",
"f_min": 186.55e12,
"f_max": 190.05e12,
"type_def": "variable_gain",
"gain_flatmax": 16,
"gain_min": 8,
"p_max": 16,
"nf_min": 7,
"nf_max": 11,
"out_voa_auto": false,
"allowed_for_design": true
},
{
"type_variety": "std_low_gain_L",
"f_min": 186.55e12,
"f_max": 190.05e12,
"type_def": "variable_gain",
"gain_flatmax": 16,
"gain_min": 8,
"p_max": 21,
"nf_min": 7,
"nf_max": 11,
"out_voa_auto": false,
"allowed_for_design": true
},
{
"type_variety": "std_low_gain_L_reduced_band",
"f_min": 187.3e12,
"f_max": 190.05e12,
"type_def": "variable_gain",
"gain_flatmax": 16,
"gain_min": 8,
"p_max": 21,
"nf_min": 7,
"nf_max": 11,
"out_voa_auto": false,
"allowed_for_design": true
},
{
"type_variety": "test",
"type_def": "variable_gain",
"gain_flatmax": 25,
"gain_min": 15,
"p_max": 21,
"nf_min": 5.8,
"nf_max": 10,
"out_voa_auto": false,
"allowed_for_design": true
},
{
"type_variety": "test_fixed_gain",
"type_def": "fixed_gain",
"gain_flatmax": 21,
"gain_min": 20,
"p_max": 21,
"nf0": 5,
"allowed_for_design": true
},
{
"type_variety": "std_booster",
"type_def": "fixed_gain",
"gain_flatmax": 21,
"gain_min": 20,
"p_max": 21,
"nf0": 5,
"allowed_for_design": false
}, {
"type_variety": "std_booster_L",
"f_min": 186.55e12,
"f_max": 190.05e12,
"type_def": "fixed_gain",
"gain_flatmax": 21,
"gain_min": 20,
"p_max": 21,
"nf0": 5,
"allowed_for_design": false
}, {
"type_variety": "std_booster_multiband",
"type_def": "multi_band",
"amplifiers": [
"std_booster",
"std_booster_L"
],
"allowed_for_design": false
}, {
"type_variety": "std_medium_gain_multiband",
"type_def": "multi_band",
"amplifiers": [
"std_medium_gain",
"std_medium_gain_L"
],
"allowed_for_design": true
},
{
"type_variety": "std_low_gain_multiband",
"type_def": "multi_band",
"amplifiers": [
"std_low_gain",
"std_low_gain_L"
],
"allowed_for_design": false
}, {
"type_variety": "std_low_gain_multiband_ter",
"type_def": "multi_band",
"amplifiers": [
"std_low_gain",
"std_low_gain_L_ter"
],
"allowed_for_design": false
}, {
"type_variety": "std_low_gain_multiband_bis",
"type_def": "multi_band",
"amplifiers": [
"std_low_gain_bis",
"std_low_gain_L"
],
"allowed_for_design": true
}, {
"type_variety": "std_low_gain_multiband_reduced_bis",
"type_def": "multi_band",
"amplifiers": [
"std_low_gain_reduced",
"std_low_gain_L"
],
"allowed_for_design": true
}, {
"type_variety": "std_low_gain_multiband_reduced",
"type_def": "multi_band",
"amplifiers": [
"std_low_gain_bis",
"std_low_gain_L_reduced_band"
],
"allowed_for_design": true
}
],
"Fiber":[{
"type_variety": "SSMF",
"dispersion": 1.67e-05,
"effective_area": 83e-12,
"pmd_coef": 1.265e-15
}
],
"Span":[{
"power_mode":true,
"delta_power_range_db": [0,0,0.5],
"max_fiber_lineic_loss_for_raman": 0.25,
"target_extended_gain": 2.5,
"max_length": 150,
"length_units": "km",
"max_loss": 28,
"padding": 10,
"EOL": 0,
"con_in": 0,
"con_out": 0
}
],
"Roadm":[{
"target_pch_out_db": -20,
"add_drop_osnr": 38,
"pmd": 0,
"pdl": 0,
"restrictions": {
"preamp_variety_list":[],
"booster_variety_list":[]
}
}],
"SI":[{
"f_min": 191.3e12,
"f_max":196.1e12,
"baud_rate": 32e9,
"spacing": 50e9,
"power_dbm": 0,
"power_range_db": [0,0,0.5],
"roll_off": 0.15,
"tx_osnr": 100,
"sys_margins": 0
}],
"Transceiver":[
{
"type_variety": "vendorA_trx-type1",
"frequency":{
"min": 191.35e12,
"max": 196.1e12
},
"mode":[
{
"format": "PS_SP64_1",
"baud_rate": 32e9,
"OSNR": 11,
"bit_rate": 100e9,
"roll_off": 0.15,
"tx_osnr": 100,
"min_spacing": 50e9,
"cost":1
},
{
"format": "PS_SP64_2",
"baud_rate": 64e9,
"OSNR": 15,
"bit_rate": 200e9,
"roll_off": 0.15,
"tx_osnr": 100,
"min_spacing": 75e9,
"cost":1
},
{
"format": "mode 1",
"baud_rate": 32e9,
"OSNR": 11,
"bit_rate": 100e9,
"roll_off": 0.15,
"tx_osnr": 100,
"min_spacing": 50e9,
"cost":1
},
{
"format": "mode 2",
"baud_rate": 64e9,
"OSNR": 15,
"bit_rate": 200e9,
"roll_off": 0.15,
"tx_osnr": 100,
"min_spacing": 75e9,
"cost":1
}
]
},
{
"type_variety": "Voyager_16QAM",
"frequency":{
"min": 191.35e12,
"max": 196.1e12
},
"mode":[
{
"format": "16QAM",
"baud_rate": 32e9,
"OSNR": 19,
"bit_rate": 200e9,
"roll_off": 0.15,
"tx_osnr": 100,
"min_spacing": 50e9,
"cost":1
}
]
},
{
"type_variety": "Voyager",
"frequency":{
"min": 191.35e12,
"max": 196.1e12
},
"mode":[
{
"format": "mode 1",
"baud_rate": 32e9,
"OSNR": 12,
"bit_rate": 100e9,
"roll_off": 0.15,
"tx_osnr": 45,
"min_spacing": 50e9,
"cost":1
},
{
"format": "mode 3",
"baud_rate": 44e9,
"OSNR": 18,
"bit_rate": 300e9,
"roll_off": 0.15,
"tx_osnr": 45,
"min_spacing": 62.5e9,
"cost":1
},
{
"format": "mode 2",
"baud_rate": 66e9,
"OSNR": 21,
"bit_rate": 400e9,
"roll_off": 0.15,
"tx_osnr": 45,
"min_spacing": 75e9,
"cost":1
},
{
"format": "mode 2 - fake",
"baud_rate": 66e9,
"OSNR": 21,
"bit_rate": 400e9,
"roll_off": 0.15,
"tx_osnr": 45,
"min_spacing": 75e9,
"cost":1
},
{
"format": "mode 4",
"baud_rate": 66e9,
"OSNR": 16,
"bit_rate": 200e9,
"roll_off": 0.15,
"tx_osnr": 45,
"min_spacing": 75e9,
"cost":1
}
]
}
]
}

View File

@@ -0,0 +1,37 @@
{
"Transceiver": [
{
"type_variety": "ZR400G",
"frequency": {
"min": 191.35e12,
"max": 196.1e12
},
"mode": [
{
"format": "400G",
"baud_rate": 60e9,
"OSNR": 24,
"bit_rate": 400e9,
"roll_off": 0.2,
"tx_osnr": 38,
"min_spacing": 75e9,
"cost": 1
}
]
}
],
"Edfa": [
{
"type_variety": "user_defined_default_amplifier",
"type_def": "variable_gain",
"gain_flatmax": 25,
"gain_min": 15,
"p_max": 21,
"nf_min": 6,
"nf_max": 10,
"advanced_config_from_json": "default_edfa_config.json",
"out_voa_auto": false,
"allowed_for_design": false
}
]
}

BIN
tests/data/ila_constraint.xlsx Executable file

Binary file not shown.

View File

@@ -63,6 +63,7 @@
{
"uid": "roadm Lannion_CAS",
"type": "Roadm",
"type_variety": "example_detailed_impairments",
"params": {
"target_pch_out_db": -18.6,
"restrictions": {
@@ -73,7 +74,14 @@
"east edfa in Lannion_CAS to Corlay": -18.6,
"east edfa in Lannion_CAS to Morlaix": -23.0,
"east edfa in Lannion_CAS to Stbrieuc": -20
},
"per_degree_impairments": [
{
"from_degree": "west edfa in Lannion_CAS to Morlaix",
"to_degree": "east edfa in Lannion_CAS to Stbrieuc",
"impairment_id": 0
}
]
},
"metadata": {
"location": {
@@ -87,6 +95,7 @@
{
"uid": "roadm Lorient_KMA",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -111,6 +120,7 @@
{
"uid": "roadm Vannes_KBE",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -134,6 +144,7 @@
{
"uid": "roadm Rennes_STA",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -157,6 +168,7 @@
{
"uid": "roadm Brest_KLA",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {

View File

@@ -62,7 +62,12 @@
},
{
"uid": "roadm Lannion_CAS",
"type_variety": "example_detailed_impairments",
"params": {
"per_degree_impairments": [{
"from_degree": "west edfa in Lannion_CAS to Morlaix",
"impairment_id": 0,
"to_degree": "east edfa in Lannion_CAS to Stbrieuc"}],
"per_degree_pch_out_db": {
"east edfa in Lannion_CAS to Corlay": -18.6,
"east edfa in Lannion_CAS to Morlaix": -23.0
@@ -661,7 +666,7 @@
"type": "Edfa",
"operational": {
"gain_target": null,
"tilt_target": 0
"tilt_target": null
}
},
{
@@ -677,7 +682,7 @@
"type": "Edfa",
"operational": {
"gain_target": null,
"tilt_target": 0
"tilt_target": null
}
},
{
@@ -693,7 +698,7 @@
"type": "Edfa",
"operational": {
"gain_target": null,
"tilt_target": 0
"tilt_target": null
}
},
{
@@ -709,7 +714,7 @@
"type": "Edfa",
"operational": {
"gain_target": null,
"tilt_target": 0
"tilt_target": null
}
},
{
@@ -727,7 +732,7 @@
"operational": {
"gain_target": 20.0,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -761,7 +766,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -779,7 +784,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -797,7 +802,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -815,7 +820,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -833,7 +838,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -851,7 +856,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -869,7 +874,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -887,7 +892,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -905,7 +910,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -923,7 +928,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -941,7 +946,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -959,7 +964,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -978,7 +983,7 @@
"operational": {
"gain_target": 18.0,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -996,7 +1001,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -1014,7 +1019,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -1032,7 +1037,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
}

View File

@@ -2,7 +2,7 @@
"raman_params": {
"flag": true,
"result_spatial_resolution": 10e3,
"solver_spatial_resolution": 50
"solver_spatial_resolution": 10e3
},
"nli_params": {
"method": "ggn_spectrally_separated",

View File

@@ -1,4 +1,7 @@
{ "nf_fit_coeff": [
{
"f_min": 191.275e12,
"f_max": 196.125e12,
"nf_fit_coeff": [
0.000168241,
0.0469961,
0.0359549,

View File

@@ -159,6 +159,7 @@
{
"uid": "roadm Lannion_CAS",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -183,6 +184,7 @@
{
"uid": "roadm Lorient_KMA",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -207,6 +209,7 @@
{
"uid": "roadm Vannes_KBE",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -230,6 +233,7 @@
{
"uid": "roadm Rennes_STA",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -253,6 +257,7 @@
{
"uid": "roadm Brest_KLA",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -276,6 +281,7 @@
{
"uid": "roadm a",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -301,6 +307,7 @@
{
"uid": "roadm b",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -326,6 +333,7 @@
{
"uid": "roadm c",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -350,6 +358,7 @@
{
"uid": "roadm d",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -373,6 +382,7 @@
{
"uid": "roadm e",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -396,6 +406,7 @@
{
"uid": "roadm f",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -420,6 +431,7 @@
{
"uid": "roadm g",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {
@@ -443,6 +455,7 @@
{
"uid": "roadm h",
"type": "Roadm",
"type_variety": "default",
"params": {
"target_pch_out_db": -20,
"restrictions": {

View File

@@ -1171,7 +1171,7 @@
"operational": {
"gain_target": 19.0,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -1190,7 +1190,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -1209,7 +1209,7 @@
"operational": {
"gain_target": 18.0,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": 0.5
}
},
@@ -1227,7 +1227,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -1245,7 +1245,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -1263,7 +1263,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -1281,7 +1281,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -1299,7 +1299,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -1318,7 +1318,7 @@
"operational": {
"gain_target": 18.5,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -1336,7 +1336,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -1354,7 +1354,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -1372,7 +1372,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -1391,7 +1391,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -1409,7 +1409,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -1428,7 +1428,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -1446,7 +1446,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -1464,7 +1464,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -1482,7 +1482,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -1500,7 +1500,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -1518,7 +1518,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -1551,7 +1551,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -1569,7 +1569,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -1587,7 +1587,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -1605,7 +1605,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -1623,7 +1623,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -1641,7 +1641,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -1659,7 +1659,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -1677,7 +1677,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -1695,7 +1695,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -1713,7 +1713,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -1731,7 +1731,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -1749,7 +1749,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -1768,7 +1768,7 @@
"operational": {
"gain_target": 18.0,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -1786,7 +1786,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -1805,7 +1805,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -1823,7 +1823,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -1841,7 +1841,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -1859,7 +1859,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -1877,7 +1877,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -1895,7 +1895,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -1913,7 +1913,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -1931,7 +1931,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -1949,7 +1949,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -1967,7 +1967,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -1985,7 +1985,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -2003,7 +2003,7 @@
"operational": {
"gain_target": 19.0,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -2021,7 +2021,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -2039,7 +2039,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -2057,7 +2057,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -2075,7 +2075,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -2093,7 +2093,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -2111,7 +2111,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -2129,7 +2129,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -2147,7 +2147,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -2165,7 +2165,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -2183,7 +2183,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -2201,7 +2201,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -2219,7 +2219,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -2237,7 +2237,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -2255,7 +2255,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -2273,7 +2273,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -2291,7 +2291,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -2309,7 +2309,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -2327,7 +2327,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
},
@@ -2345,7 +2345,7 @@
"operational": {
"gain_target": null,
"delta_p": null,
"tilt_target": 0,
"tilt_target": null,
"out_voa": null
}
}

View File

@@ -0,0 +1,6 @@
,signal,nli
0,3.9807550201531427e-07,1.0345007661598643e-10
1,3.582672964406964e-07,8.554802579711129e-11
2,5.174953110822109e-07,1.2476289414924814e-10
3,3.1845777742391393e-07,8.147850636202276e-11
4,4.776857897651456e-07,1.5683132697931042e-10
1 signal nli
2 0 3.9807550201531427e-07 1.0345007661598643e-10
3 1 3.582672964406964e-07 8.554802579711129e-11
4 2 5.174953110822109e-07 1.2476289414924814e-10
5 3 3.1845777742391393e-07 8.147850636202276e-11
6 4 4.776857897651456e-07 1.5683132697931042e-10

View File

@@ -1,96 +1,97 @@
0.001,0.0007537739940510926,0.0005921033539224395,0.000384643453726324,0.00024710943492700773,0.00015765779381207088,0.00010015276356884663,6.345008665672524e-05,4.012925332336102e-05,2.535268958174273e-05
0.001,0.0007532443480762404,0.0005915606741358828,0.00038408573214392957,0.00024666764094038643,0.00015734224135307426,9.993879038586218e-05,6.330912140259024e-05,4.003794165686942e-05,2.529414108865862e-05
0.001,0.0007527148738848327,0.0005910183036445593,0.0003835286706438232,0.0002462265418760313,0.00015702726304657165,9.972523988324127e-05,6.316844848796591e-05,3.994682503096186e-05,2.5235719950422228e-05
0.001,0.0007521855703345118,0.0005904762413907948,0.00038297226807207136,0.0002457861365766504,0.00015671285789580896,9.9512111295817e-05,6.302806736731544e-05,3.985590307420444e-05,2.5177425921282973e-05
0.001,0.0007516564362539944,0.0005899344862777934,0.00038241652320864807,0.0002453464238190796,0.00015639902485083639,9.929940381972637e-05,6.288797746852316e-05,3.976517539750482e-05,2.511925874398998e-05
0.001,0.0007511274704431355,0.0005893930371697809,0.0003818614347679428,0.0002449074023149522,0.00015608576280913723,9.908711661290977e-05,6.27481781932559e-05,3.967464159435973e-05,2.5061218149955632e-05
0.001,0.0007505986716729718,0.0005888518928921378,0.00038130700139925517,0.0002444690707113658,0.00015577307061625246,9.887524879560432e-05,6.260866891731864e-05,3.958430124109855e-05,2.5003303859417958e-05
0.001,0.0007500678710880661,0.0005883088511431218,0.000380751009486411,0.0002440296996901373,0.00015545972380501664,9.866297459432463e-05,6.246890748950651e-05,3.949380391318895e-05,2.4945291488462056e-05
0.001,0.0007495350705096461,0.0005877639154939723,0.000380193466563788,0.00024358929686534952,0.00015514572847430736,9.8450298405315e-05,6.232889690863924e-05,3.9403151593579556e-05,2.4887182324516918e-05
0.001,0.0007490002717484986,0.0005872170894971442,0.00037963438011605534,0.00024314786979147204,0.00015483109067004745,9.823722458416644e-05,6.218864014470764e-05,3.931234624568946e-05,2.4828977642138712e-05
0.001,0.0007484634766050366,0.000586668376686434,0.0003790737575785661,0.00024270542596389042,0.0001545158163857142,9.802375744622405e-05,6.204814013916893e-05,3.9221389813611975e-05,2.4770678703146694e-05
0.001,0.0007479199274773811,0.0005861128912299699,0.0003785065486556895,0.00024225795000622747,0.0001541970308568484,9.780794472023814e-05,6.190610951865765e-05,3.9129447888412384e-05,2.471175028700643e-05
0.001,0.0007473696306726699,0.0005855506450602122,0.0003779327791658341,0.00024180546890527417,0.0001538747562360148,9.758980264023896e-05,6.176255947727244e-05,3.903652792388679e-05,2.4652197254708885e-05
0.001,0.0007468125926679213,0.0005849816503235855,0.0003773524752207052,0.00024134800990073543,0.00015354901486124996,9.736934756691086e-05,6.161750129261558e-05,3.8942637427869684e-05,2.459202450185328e-05
0.001,0.0007462488201102061,0.0005844059193804029,0.00037676566322402907,0.00024088560048334876,0.0001532198292542639,9.714659598616437e-05,6.147094632476142e-05,3.884778396152801e-05,2.4531236958179027e-05
0.001,0.0007456783198168171,0.0005838234648047683,0.00037617236987025305,0.00024041826839299018,0.00015288722211863548,9.692156450770277e-05,6.132290601522212e-05,3.875197513865345e-05,2.4469839587096592e-05
0.001,0.0007451010987754332,0.0005832342993844907,0.0003755726221432343,0.0002399460416167659,0.00015255121633799497,9.66942698635831e-05,6.11733918859104e-05,3.8655218624953314e-05,2.4407837385217267e-05
0.001,0.0007445173992825126,0.0005826386743528757,0.00037496668540476865,0.00023946913369259697,0.00015221196586566552,9.646481704279825e-05,6.102247334575324e-05,3.85575594785277e-05,2.4345259282747418e-05
0.001,0.0007439272282773631,0.0005820366023339485,0.0003743545861363169,0.00023898757201912962,0.00015186949307274757,9.623322238874437e-05,6.0870161643097905e-05,3.845900518061352e-05,2.4282110155051444e-05
0.001,0.0007433305928659832,0.0005814280961601982,0.00037373635109929905,0.0002385013842326201,0.0001515238205025659,9.599950236146117e-05,6.071646810276464e-05,3.835956326175255e-05,2.4218394908993806e-05
0.001,0.0007427275003211868,0.0005808131688724332,0.0003731120073337174,0.00023801059820498021,0.0001511749708688244,9.576367353617374e-05,6.05614041249978e-05,3.825924130107498e-05,2.4154118482464792e-05
0.001,0.0007421180800523362,0.0005801919587229117,0.00037248171070273063,0.0002375153439047009,0.00015082303982525373,9.55258019540184e-05,6.0405013700224733e-05,3.815806798909622e-05,2.4089299350133826e-05
0.001,0.0007415023395254894,0.0005795644789202474,0.00037184548827748576,0.0002370156491221818,0.00015046804996987382,9.528590408468248e-05,6.0247308147258e-05,3.8056050847170796e-05,2.4023942410771268e-05
0.001,0.0007408802863797739,0.000578930742889133,0.00037120336741830446,0.00023651154189285886,0.00015011002407818366,9.504399651802114e-05,6.008829886368558e-05,3.7953197447440844e-05,2.395805259559495e-05
0.001,0.0007402519284274773,0.00057829076427012,0.0003705553757730914,0.00023600305049498863,0.0001497489851010917,9.480009596242987e-05,5.992799732470356e-05,3.784951541204015e-05,2.389163486774317e-05
0.001,0.0007396172736541335,0.0005776445569193926,0.0003699015412757306,0.000235490203447419,0.00014938495616282697,9.455421924320194e-05,5.976641508193571e-05,3.774501241228877e-05,2.38246942217421e-05
0.001,0.0007389763302186035,0.0005769921349085269,0.00036924189214444916,0.00023497302950733012,0.00014901796055883247,9.4306383300876e-05,5.960356376224896e-05,3.763969616788547e-05,2.37572356829714e-05
0.001,0.000738329973009011,0.0005763343882557762,0.00036857732657886674,0.00023445223185895243,0.00014864849677321228,9.40569245366171e-05,5.943966431343476e-05,3.753370952478887e-05,2.3689350732036766e-05
0.001,0.0007376782088319843,0.0005756713289449496,0.0003679078688863157,0.00023392783529630037,0.00014827658488585004,9.38058575472753e-05,5.927472675087035e-05,3.7427059131368685e-05,2.362104369630353e-05
0.001,0.0007370210446325295,0.0005750029691304239,0.000367233543593211,0.00023339986479263558,0.00014790224510292775,9.355319701349314e-05,5.910876114408311e-05,3.7319751670569666e-05,2.3552318925085614e-05
0.001,0.0007363584874940915,0.0005743293211369546,0.0003665543754437431,0.00023286834549865966,0.00014752549775524457,9.329895769838934e-05,5.8941777615809794e-05,3.721179385927125e-05,2.348318078922229e-05
0.001,0.0007356906659117175,0.0005736505214206793,0.00036587051603697917,0.00023233340267585003,0.00014714643450378646,9.30432026577021e-05,5.8773818072131705e-05,3.710321298927822e-05,2.3413646846771747e-05
0.001,0.0007350175870680764,0.0005729665823498456,0.00036518198995355594,0.00023179506120909636,0.00014676507541963834,9.278594644638945e-05,5.8604892484780656e-05,3.699401567385024e-05,2.3343721399750524e-05
0.001,0.000734339258284937,0.0005722775164633901,0.0003644888219905243,0.00023125334615855053,0.0001463814406964208,9.252720370024704e-05,5.8435010877524154e-05,3.688420855938328e-05,2.327340877117354e-05
0.001,0.0007336556870231954,0.0005715833364706749,0.00036379103715988533,0.00023070828275766533,0.00014599555064848363,9.226698913450141e-05,5.82641833251609e-05,3.677379832472749e-05,2.320271330460301e-05
0.001,0.0007329668808828947,0.0005708840552512191,0.00036308866068712113,0.00023015989641122435,0.00014560742570909416,9.200531754239911e-05,5.8092419952513674e-05,3.666279168050168e-05,2.313163936369656e-05
0.001,0.000732272847603227,0.0005701796858544125,0.000362381718009681,0.0002296082126933358,0.00014521708642859763,9.174220379377606e-05,5.791973093340874e-05,3.6551195368400524e-05,2.3060191331749373e-05
0.001,0.0007315751779154508,0.0005694718366517781,0.00036167180797618383,0.00022905447155647377,0.00014482540661409508,9.147823538482221e-05,5.774650123146614e-05,3.643925790598459e-05,2.2988528215049473e-05
0.001,0.0007308738763564251,0.0005687605159526348,0.00036095894758939165,0.00022849869020493823,0.00014443240010265552,9.121342232553745e-05,5.7572737692798364e-05,3.6326983828340116e-05,2.2916652961499898e-05
0.001,0.0007301689475478705,0.0005680457321686527,0.00036024315397386176,0.00022794088593578913,0.00014403808079282816,9.094777466478586e-05,5.739844718775089e-05,3.6214377685641065e-05,2.2844568528419092e-05
0.001,0.0007294603961963875,0.0005673274938137002,0.0003595244443750873,0.00022738107613769066,0.00014364246264358423,9.068130248947494e-05,5.72236366103174e-05,3.610144404275241e-05,2.2772277882278848e-05
0.001,0.0007287502876018436,0.0005666079096289159,0.00035880496633647314,0.00022682095171468864,0.00014324674865159545,9.041481948469436e-05,5.7048841153261715e-05,3.598852922211342e-05,2.270000293927642e-05
0.001,0.0007280386231103084,0.0005658869826353605,0.0003580847262718071,0.00022626051891339797,0.00014285094367250402,9.014832907727154e-05,5.687406312117876e-05,3.587563473352017e-05,2.2627744673782604e-05
0.001,0.0007273254041056322,0.0005651647158992671,0.00035736373064750184,0.00022569978402038908,0.00014245505258865028,8.988183471111395e-05,5.669930482943582e-05,3.5762762093538084e-05,2.2555504064421286e-05
0.001,0.0007266106320094578,0.0005644411125319691,0.00035664198598218,0.00022513875336164715,0.0001420590803085807,8.961533984682783e-05,5.652456860390248e-05,3.564991282531874e-05,2.2483282093948716e-05
0.001,0.000725894308281204,0.0005637161756897977,0.0003559194988462394,0.00022457743330201225,0.00014166303176654256,8.934884796133105e-05,5.634985678067539e-05,3.5537088458413665e-05,2.2411079749130865e-05
0.001,0.0007251764344180624,0.0005629899085739927,0.00035519627586142176,0.0002240158302446243,0.00014126691192198565,8.90823625474685e-05,5.6175171705805915e-05,3.542429052859005e-05,2.233889802062196e-05
0.001,0.0007244588135748975,0.0005622641246704724,0.00035447409591105305,0.0002234553120905153,0.00014087167955905718,8.881652603390643e-05,5.600093342830372e-05,3.531178983274928e-05,2.2266910019981595e-05
0.001,0.000723741443178776,0.000561538821268995,0.0003537529553873339,0.00022289587522719752,0.00014047733166655684,8.855133617099835e-05,5.5827140373801375e-05,3.519958531186087e-05,2.219511505192651e-05
0.001,0.0007230243206833482,0.0005608139956950427,0.00035303285074046774,0.00022233751609917817,0.00014008386527925162,8.82867907426191e-05,5.565379099102327e-05,3.508767592227262e-05,2.212351243120618e-05
0.001,0.0007223074435688039,0.0005600896453097011,0.0003523137784782074,0.00022178023120736695,0.00013969127747733319,8.802288756574066e-05,5.5480883751481105e-05,3.4976060635503277e-05,2.2052101482465692e-05
0.001,0.0007215926247557181,0.0005593676122940626,0.00035159759247597197,0.00022122546934306127,0.00013930059415776796,8.776031848020719e-05,5.5308872854303e-05,3.486503301641155e-05,2.198107017600086e-05
0.001,0.0007208798585848073,0.0005586478889723664,0.0003508842795507963,0.0002206732171528304,0.00013891180440309996,8.749907547557891e-05,5.513775276548628e-05,3.475458937431628e-05,2.1910416102241813e-05
0.001,0.0007201691394257483,0.000557930467712979,0.00035017382661216696,0.00022012346138632064,0.00013852489738482468,8.723915060881119e-05,5.49675179985075e-05,3.464472605058592e-05,2.184013687270143e-05
0.001,0.0007194604616770773,0.00055721534092818,0.00034946622066134466,0.00021957618889536463,0.00013813986236255893,8.698053600359808e-05,5.4798163113848986e-05,3.453543941831367e-05,2.177023011975932e-05
0.001,0.0007187538197660722,0.0005565025010739346,0.00034876144879066544,0.00021903138663308575,0.0001377566886832086,8.672322384971475e-05,5.462968271852315e-05,3.442672588199151e-05,2.1700693496445714e-05
0.001,0.0007180492081486484,0.0005557919406496801,0.00034805949818288173,0.0002184890416530366,0.00013737536578016266,8.646720640237894e-05,5.446207146561145e-05,3.431858187719449e-05,2.1631524676231647e-05
0.001,0.000717348639431565,0.0005550856739198547,0.00034736232071304855,0.00021795064331956514,0.00013699693247692832,8.621317757037385e-05,5.429578217858938e-05,3.421129897003673e-05,2.1562909902755936e-05
0.001,0.0007166521035756881,0.0005543836868927082,0.0003466698924934393,0.00021741616794755068,0.00013662136971116798,8.596112351100096e-05,5.413080535731451e-05,3.410487085131832e-05,2.1494845067789903e-05
0.001,0.0007159595906065037,0.0005536859656730149,0.00034598218983055497,0.0002168855920630381,0.0001362486585998701,8.571103051605296e-05,5.396713159578493e-05,3.399929127512844e-05,2.142732610463052e-05
0.001,0.0007152710906138687,0.0005529924964615861,0.00034529918922366796,0.00021635889240138666,0.0001358787804376394,8.546288501047042e-05,5.380475158117202e-05,3.389455405818364e-05,2.1360348987661796e-05
0.001,0.0007145881681833736,0.0005523048607339887,0.0003446224616264519,0.00021583728670966556,0.00013551259312919557,8.521726369129195e-05,5.364404315662281e-05,3.379090310339315e-05,2.129406976339983e-05
0.001,0.0007139108109389651,0.0005516230407004492,0.0003439519758859039,0.00021532074399295122,0.00013515007172518374,8.497414844816332e-05,5.3484993898260945e-05,3.368833016244125e-05,2.122848306212633e-05
0.001,0.0007132390066148024,0.0005509470187317473,0.00034328770115903844,0.00021480923358720733,0.0001347911915544671,8.473352137819455e-05,5.3327591526929936e-05,3.358682708410006e-05,2.1163583577742056e-05
0.001,0.0007125727430549207,0.0005502767773585094,0.000342629606910633,0.00021430272515636744,0.0001344359282214269,8.449536478383494e-05,5.317182390666476e-05,3.348638581318404e-05,2.109936606707349e-05
0.001,0.0007119120082129148,0.0005496122992705212,0.0003419776629110174,0.0002138011886894788,0.00013408425760331254,8.425966117078749e-05,5.3017679043188334e-05,3.3386998389521964e-05,2.1035825349191292e-05
0.001,0.000711256790151613,0.0005489535673160376,0.0003413318392338714,0.00021330459449785352,0.00013373615584760944,8.40263932459383e-05,5.286514508242194e-05,3.3288656946938245e-05,2.0972956304734848e-05
0.001,0.0007106071943639499,0.0005483006816957998,0.00034069221933208274,0.0002128129992904075,0.00013339165932644894,8.379558393280961e-05,5.271423641048183e-05,3.31913705135711e-05,2.091076460544407e-05
0.001,0.000709963208882901,0.0005476536252143895,0.0003400587732671483,0.0002123263734210078,0.00013305074425072359,8.356721599784782e-05,5.256494122003263e-05,3.3095131256746724e-05,2.0849245154782437e-05
0.001,0.0007093248218486061,0.0005470123808316875,0.00033943147139689077,0.0002118446875576196,0.00013271338709432742,8.334127240311385e-05,5.241724783997488e-05,3.299993143509595e-05,2.0788392916005465e-05
0.001,0.0007086920215080653,0.0005463769316622218,0.0003388102843733889,0.00021136791267964032,0.0001323795645916927,8.311773630434548e-05,5.2271144734051514e-05,3.290576339760186e-05,2.07282029115292e-05
0.001,0.0007080656480431051,0.0005457481216341828,0.0003381960373995552,0.00021089668206097172,0.0001320497200486003,8.289690449717853e-05,5.2126825862102536e-05,3.2812752146082854e-05,2.0668755034757233e-05
0.001,0.0007074456886869565,0.0005451259321489777,0.0003375886977799707,0.0002104309633113142,0.00013172382748945162,8.26787581753205e-05,5.198427834496719e-05,3.2720889139431744e-05,2.061004372929991e-05
0.001,0.0007068321308093747,0.0005445103448031184,0.0003369882331820464,0.00020997072442018424,0.00013140186125447996,8.246327876643199e-05,5.18434894660219e-05,3.2630165945308436e-05,2.055206350992823e-05
0.001,0.0007062249619162967,0.0005439013413874698,0.00033639461163356655,0.00020951593375373114,0.00013108379599680725,8.225044792981545e-05,5.170444666951808e-05,3.254057423900392e-05,2.0494808961820763e-05
0.001,0.00070562416964951,0.0005432989038865089,0.00033580780152024723,0.000209066560051587,0.00013076960667953474,8.204024755412909e-05,5.156713755893784e-05,3.2452105802317056e-05,2.0438274739819433e-05
0.001,0.0007050297417863318,0.0005427030144775926,0.0003352277715833316,0.00020862257242375786,0.00013045926857287288,8.183265975513502e-05,5.143154989537623e-05,3.236475252244954e-05,2.038245556769746e-05
0.001,0.0007044417829621171,0.000542113771820027,0.0003346546023905152,0.00020818402485557293,0.00013015281596227648,8.162770599537212e-05,5.129769708700084e-05,3.227852278867728e-05,2.032735670561579e-05
0.001,0.0007038602809995153,0.0005415311581470623,0.00033408826282687573,0.00020775088664703998,0.00012985022429639665,8.142536853201701e-05,5.116556699709043e-05,3.219340855821242e-05,2.0272972923816322e-05
0.001,0.0007032852238493367,0.0005409551558747416,0.0003335287221154158,0.00020732312745044945,0.00012955146931603386,8.122562983828357e-05,5.103514763884953e-05,3.2109401888525124e-05,2.0219299058105656e-05
0.001,0.0007027165995902542,0.0005403857476012292,0.00033297594981485264,0.00020690071726752732,0.0001292565270515082,8.102847260135871e-05,5.090642717392409e-05,3.202649493632917e-05,2.0166330009182866e-05
0.001,0.0007021546252265139,0.0005398231466905069,0.00033243014325207994,0.00020648380199548492,0.0001289654971719027,8.083396250547584e-05,5.077944809587575e-05,3.194471491165552e-05,2.0114083097018264e-05
0.001,0.0007015992888126556,0.0005392673356287205,0.0003318912717105927,0.00020607235137144977,0.0001286783555062261,8.06420820982489e-05,5.065419847368218e-05,3.186405391103787e-05,2.006255318369691e-05
0.001,0.0007010505785332368,0.0005387182970867077,0.00033135930481238495,0.00020566633548374424,0.0001283950781739038,8.04528141416734e-05,5.053066652493675e-05,3.1784504130324826e-05,2.001173519622426e-05
0.001,0.000700508482702546,0.0005381760139193414,0.00033083421251577956,0.00020526572476908743,0.000128115641582197,8.026614161010359e-05,5.040884061439589e-05,3.170605786368809e-05,1.9961624125869314e-05
0.001,0.0006999729897643184,0.0005376404691648787,0.00033031596511327947,0.00020487049000982136,0.00012784002242364822,8.008204768824872e-05,5.028870925253973e-05,3.1628707502639986e-05,1.9912215027513866e-05
0.001,0.0006994440882914515,0.0005371116460443127,0.0003298045332294241,0.0002044806023311588,0.0001275681976735486,7.990051576919067e-05,5.0170261094149856e-05,3.155244553506268e-05,1.9863503019009735e-05
0.001,0.0006989172535560769,0.0005365850419669894,0.000329295612913881,0.00020409280438264766,0.00012729790663346764,7.972004038787022e-05,5.0052515589855926e-05,3.147664135129994e-05,1.9815085586326718e-05
0.001,0.0006983924815322933,0.0005360606511477293,0.0003287891938968759,0.00020370708584067882,0.00012702914094133737,7.954061545150935e-05,4.993546855036179e-05,3.140129216611291e-05,1.9766960914662127e-05
0.001,0.0006978697681747856,0.000535538467781285,0.000328285265898271,0.00020332343638453147,0.00012676189224377013,7.936223487646896e-05,4.981911579385119e-05,3.1326395199731696e-05,1.971912719297887e-05
0.001,0.0006973491094188342,0.0005350184860423863,0.0003277838186277228,0.0002029418456965422,0.0001264961521961901,7.918489258833681e-05,4.970345314604528e-05,3.125194767789152e-05,1.967158261402843e-05
0.001,0.0006968284099289676,0.000534498597351666,0.00032728277956097635,0.00020256071739357045,0.0001262308004979493,7.900783730702533e-05,4.958798911408524e-05,3.1177632631488905e-05,1.9624124503146986e-05
0.001,0.0006963076677967887,0.0005339787996978908,0.00032678214616920946,0.00020218004908417888,0.0001259658352285323,7.883106763041168e-05,4.947272273059253e-05,3.110344941552445e-05,1.957675243920473e-05
0.001,0.0006957868810888677,0.0005334590910383602,0.00032628191587964447,0.00020179983833834103,0.00012570125443876325,7.865458213663353e-05,4.935765301510161e-05,3.102939737649859e-05,1.9529465995615212e-05
0.001,0.0006952660478468047,0.0005329394692990367,0.0003257820860759608,0.00020142008268794192,0.0001254370561512512,7.847837938443003e-05,4.924277897429975e-05,3.0955475852573814e-05,1.94822647404421e-05
0.001,0.00069474516608728,0.0005324199323746772,0.00032528265409871067,0.0002010407796272818,0.0001251732383608348,7.830245791348127e-05,4.91280996022673e-05,3.088168417373684e-05,1.943514823650581e-05
0 km,7 km,10 km,20 km,30 km,40 km,50 km,60 km,70 km,80 km
0.001,0.0007539177767305848,0.0005922648034750569,0.00038490617279658137,0.000247392320543982,0.00015791555306607623,0.0001003671566373715,6.361853747449743e-05,4.0256607010916584e-05,2.5446360651215025e-05
0.001,0.0007533902419958185,0.0005917244917926066,0.0003843504806873478,0.0002469518485683003,0.0001576007478372822,0.00010015356028336005,6.347773727057954e-05,4.016534974386181e-05,2.5387814123899557e-05
0.001,0.0007528628792251897,0.0005911844879166931,0.0003837954443648265,0.0002465120671477305,0.00015728651344926157,9.994038442151031e-05,6.333722806950528e-05,4.007428674216739e-05,2.5329394519652018e-05
0.001,0.0007523356872805944,0.0005906447907925071,0.0003832410626787123,0.0002460729751307637,0.00015697284891103737,9.972762829117227e-05,6.319700932883725e-05,3.9983417636365086e-05,2.5271101593906498e-05
0.001,0.0007518086649950493,0.0005901053993262767,0.0003826873344129807,0.000245634571300401,0.00015665975317873245,9.95152910932062e-05,6.305708047968383e-05,3.9892742039402306e-05,2.5212935090640287e-05
0.001,0.0007512818111727442,0.0005895663123854124,0.00038213425828639575,0.0002451968543747938,0.0001563472251561599,9.930337199043154e-05,6.291744092702573e-05,3.980225954686196e-05,2.5154894742516358e-05
0.001,0.0007507551245890757,0.0005890275287986403,0.0003815818329529933,0.00024475982300791935,0.00015603526369546326,9.909187010814736e-05,6.277809005009466e-05,3.9711969737226656e-05,2.5096980271060998e-05
0.001,0.0007502264452226824,0.0005884868559085152,0.00038102785262825065,0.00024432175277214066,0.00015572264698517112,9.88799609470651e-05,6.26384862087587e-05,3.9621522312922004e-05,2.5038967246912867e-05
0.001,0.000749695774901522,0.0005879442972710813,0.00038047232480109013,0.00024388265123925605,0.00015540938109456906,9.866764888521257e-05,6.249863239143498e-05,3.953091925128679e-05,2.498085695464162e-05
0.001,0.0007491631154430714,0.0005873998564236413,0.00037991525691100856,0.00024344252592185564,0.00015509547204033507,9.845493826021018e-05,6.235853155787194e-05,3.944016251022327e-05,2.4922650665997884e-05
0.001,0.0007486284686543365,0.0005868535368848297,0.00037935665634847824,0.00024300138427382333,0.00015478092578703268,9.824183336966692e-05,6.2218186639435e-05,3.9349254028404254e-05,2.4864349640052216e-05
0.001,0.0007480870957031576,0.000586300474032492,0.00037879149123861057,0.0002425552230413961,0.00015446287448415177,9.80263854642033e-05,6.207631182945079e-05,3.925735993392708e-05,2.4805418700342044e-05
0.001,0.0007475390029192987,0.0005857406797529387,0.0003782197872436036,0.00024210406905347345,0.00015414134016629157,9.780861070114894e-05,6.193291827596257e-05,3.9164487654400794e-05,2.4745862693628148e-05
0.001,0.0007469841968019674,0.0005851741661454001,0.0003776415703174324,0.00024164794939077438,0.0001538163450528885,9.758852536415706e-05,6.178801721036571e-05,3.907064467141267e-05,2.4685686501265697e-05
0.001,0.0007464226840200367,0.0005846009455219824,0.00037705686670463337,0.0002411868913840224,0.0001534879115464833,9.736614586183658e-05,6.164161994641891e-05,3.897583851984993e-05,2.462489503874857e-05
0.001,0.0007458544714121565,0.0005840210304075477,0.00037646570293897594,0.00024072092261200308,0.00015315606223087128,9.714148872627883e-05,6.149373787917076e-05,3.888007678716513e-05,2.45634932552282e-05
0.001,0.0007452795659868886,0.0005834344335395587,0.00037586810584214404,0.0002402500708997022,0.000152820819869329,9.691457061165131e-05,6.134438248396139e-05,3.878336711269497e-05,2.450148613305654e-05
0.001,0.0007446982091229053,0.0005828414050804809,0.00037526433980072227,0.0002397745491251193,0.0001524823380310375,9.668549630724793e-05,6.119362307821724e-05,3.868575452092861e-05,2.4438902597094615e-05
0.001,0.0007441104077793266,0.0005822419576041865,0.000374654431136991,0.00023929438452844706,0.0001521406389697796,9.645428208068799e-05,6.10414708650461e-05,3.858724646752558e-05,2.4375747508899864e-05
0.001,0.0007435161690815189,0.0005816361038919765,0.0003740384064517259,0.00023880960458647735,0.00015179574511101,9.622094431596755e-05,6.0887937123913e-05,3.848785045741014e-05,2.4312025761525238e-05
0.001,0.0007429155003212045,0.0005810238569324259,0.0003734162926228523,0.00023832023701067176,0.00015144767905002232,9.598549951201614e-05,6.073303320960556e-05,3.83875740440667e-05,2.42477422790523e-05
0.001,0.0007423085305088799,0.0005804053544492479,0.00037278824495395505,0.0002378264113599139,0.00015109653618969462,9.574801357389848e-05,6.057680304696976e-05,3.828644589147927e-05,2.4182915529390252e-05
0.001,0.0007416952671281527,0.0005797806095975203,0.0003721542903540935,0.000237328155265129,0.00015074233901078615,9.550850289594038e-05,6.041925791001213e-05,3.8184473495775654e-05,2.411755039775751e-05
0.001,0.0007410757178351933,0.0005791496357472955,0.0003715144560199718,0.00023682549660121693,0.00015038511017095082,9.526698399235154e-05,6.026040915139781e-05,3.8081664403831414e-05,2.4051651801815565e-05
0.001,0.0007404498904588522,0.0005785124464833875,0.0003708687694343879,0.00023631846348487102,0.00015002487250269267,9.502347349561174e-05,6.0100268201280124e-05,3.797802621247342e-05,2.3985224691142176e-05
0.001,0.000739817793000736,0.0005778690556051271,0.0003702172583646133,0.00023580708427235972,0.00014966164901128063,9.477798815483971e-05,5.9938846566140114e-05,3.787356656768574e-05,2.3918274046705576e-05
0.001,0.0007391794336352683,0.0005772194771261406,0.00036955995086080306,0.00023529138755728292,0.00014929546287266413,9.453054483414699e-05,5.977615582759686e-05,3.776829316380097e-05,2.385080488032797e-05
0.001,0.0007385356837401969,0.0005765645972068202,0.00036889774196575574,0.0002347720745464529,0.00014892681149659162,9.42814794200372e-05,5.9612416728092556e-05,3.7662348796962334e-05,2.378290869241134e-05
0.001,0.0007378865501365786,0.0005759044277808471,0.0003682306558404449,0.0002342491698918279,0.00014855571485941296,9.403080644324396e-05,5.944763924389705e-05,3.755574009362634e-05,2.371458979861065e-05
0.001,0.0007372320397833855,0.0005752389809515306,0.00036755871686373843,0.00023372269842386576,0.0001481821930634036,9.377854051813779e-05,5.92818334053861e-05,3.74484737148236e-05,2.364585253654512e-05
0.001,0.0007365721597776102,0.0005745682689916729,0.0003668819496311701,0.00023319268514975972,0.00014780626633511263,9.352469634142839e-05,5.911500929610015e-05,3.734055635551828e-05,2.35767012653732e-05
0.001,0.0007359070382096695,0.0005738924278329212,0.00036620050520582223,0.0002326592549483615,0.00014742802610623578,9.326933684741753e-05,5.8947208765596136e-05,3.723201528626343e-05,2.3507153539330125e-05
0.001,0.0007352366822744919,0.0005732114697907263,0.0003655144080205807,0.0002321224325628545,0.00014704749234532768,9.30124765259338e-05,5.877844174725213e-05,3.712285709891949e-05,2.3437213649054356e-05
0.001,0.0007345610993055855,0.0005725254073502257,0.0003648236827235576,0.00023158224291094424,0.00014666468514311576,9.275412994749425e-05,5.860871822644595e-05,3.701308841848994e-05,2.336688590620212e-05
0.001,0.0007338802967751745,0.0005718342531661053,0.0003641283541767086,0.00023103871108296522,0.00014627962471074844,9.249431176193324e-05,5.843804823954878e-05,3.690271590243443e-05,2.32961746429929e-05
0.001,0.0007331942822941306,0.0005711380200622195,0.000363428447454292,0.00023049186233985435,0.00014589233137793237,9.223303669696582e-05,5.826644187292669e-05,3.679174623998899e-05,2.3225084211761806e-05
0.001,0.0007325030636119942,0.000570436721031382,0.0003627239878414387,0.00022994172211121704,0.00014550282559116622,9.197031955679165e-05,5.809390926192732e-05,3.66801861514784e-05,2.3153618984504423e-05
0.001,0.0007318082249846354,0.000569731957456593,0.0003620165686744435,0.0002293895269980944,0.0001451119793900387,9.170674702405544e-05,5.792083507086079e-05,3.656828410642266e-05,2.3081938026911105e-05
0.001,0.0007311097709589727,0.0005690237376093709,0.0003613062068501535,0.00022883529410468975,0.00014471980653999792,9.14423290636205e-05,5.774722611940683e-05,3.6456044625219865e-05,2.3010044279099164e-05
0.001,0.0007304077061664716,0.0005683120698629669,0.00036059291938656614,0.00022827904062761942,0.00014432632086784533,9.117707567918865e-05,5.757308925149413e-05,3.6343472243382366e-05,2.293794069062729e-05
0.001,0.0007297020353231152,0.0005675969626922158,0.0003598767234219355,0.00022772078385475435,0.00014393153626068395,9.091099691249356e-05,5.739843133472259e-05,3.6230571511141116e-05,2.2865630220232028e-05
0.001,0.0007289948155254126,0.0005668805157203741,0.00035915975887038315,0.00022716220982550104,0.00014353665302637602,9.064490513205597e-05,5.722378701487135e-05,3.611768859725593e-05,2.279333481077374e-05
0.001,0.0007282860481242219,0.0005661627319510184,0.0003584420321019746,0.00022660332474955334,0.0001431416759965279,9.037880375071969e-05,5.7049158588914064e-05,3.6004825007582225e-05,2.2721055434706506e-05
0.001,0.0007275757345080665,0.0005654436144326382,0.00035772354953912867,0.0002260441348764214,0.00014274661002939483,9.011269619839399e-05,5.687454836459578e-05,3.5891982254752056e-05,2.2648793068745655e-05
0.001,0.0007268638761030398,0.0005647231662585116,0.0003570043176561602,0.0002254846464948739,0.0001423514600093734,8.984658592167178e-05,5.6699958660169715e-05,3.5779161857992474e-05,2.2576548693746487e-05
0.001,0.0007261504743729061,0.0005640013905666712,0.00035628434297892044,0.0002249248659324104,0.00014195623084652692,8.958047638345721e-05,5.652539180412445e-05,3.5666365342942064e-05,2.250432329458613e-05
0.001,0.0007254355308190145,0.0005632782905397587,0.00035556363208430486,0.00022436479955468554,0.0001415609274760624,8.931437106256734e-05,5.635085013490999e-05,3.5553594241465086e-05,2.2432117860037706e-05
0.001,0.0007247208411865314,0.0005625556717890254,0.0003548439578507697,0.00022380581171795803,0.00014116650687104502,8.904891159204534e-05,5.61767534392646e-05,3.544111934056619e-05,2.2360105593797506e-05
0.001,0.00072400640290786,0.000561833531609933,0.00035412531668185007,0.00022324789882467925,0.00014077296603347102,8.878409573173543e-05,5.600310014889176e-05,3.5328939584811035e-05,2.228828580259237e-05
0.001,0.0007232922134419361,0.000561111867333509,0.00035340770503880037,0.00022269105733400152,0.00014038030201108317,8.8519921274859e-05,5.5829888718494674e-05,3.521705393409239e-05,2.221665780315407e-05
0.001,0.0007225782702742098,0.0005603906763262448,0.0003526911194401051,0.00022213528376118449,0.00013998851189683077,8.825638604758897e-05,5.5657117625479614e-05,3.510546136342301e-05,2.214522092208301e-05
0.001,0.0007218663790349207,0.0005596717927826706,0.0003519774072686018,0.00022158202285215626,0.0001395986194011808,8.79941808494171e-05,5.5485240659247415e-05,3.499445534348073e-05,2.207416317565271e-05
0.001,0.0007211565340671307,0.000558955209053062,0.0003512665554090523,0.0002210312613239567,0.0001392106136609281,8.773329770591506e-05,5.531425230770577e-05,3.4884032196140665e-05,2.200348216114185e-05
0.001,0.0007204487297429265,0.0005582409175317231,0.00035055855083818805,0.00022048298599609717,0.00013882448390129787,8.747372870968443e-05,5.514414710600884e-05,3.477418827518741e-05,2.1933175496831414e-05
0.001,0.0007197429604633029,0.0005575289106567639,0.00034985338062403464,0.00021993718378969884,0.00013844021943515845,8.721546601972457e-05,5.497491963609735e-05,3.466491996599965e-05,2.1863240821795316e-05
0.001,0.0007190392206580874,0.0005568191809099186,0.0003491510319252488,0.00021939384172660586,0.00013805780966217872,8.695850186076947e-05,5.480656452622117e-05,3.455622368522282e-05,2.1793675795681418e-05
0.001,0.0007183375047857581,0.0005561117208162645,0.0003484514919904163,0.00021885294692850114,0.00013767724406801954,8.670282852265318e-05,5.463907645048003e-05,3.444809588045186e-05,2.172447809850241e-05
0.001,0.0007176398171146462,0.0005554085359032386,0.00034775670623974134,0.0002183159850558065,0.00013729955964329822,8.644913914890404e-05,5.447290801376681e-05,3.4340828149382966e-05,2.165583410030806e-05
0.001,0.0007169461476104001,0.0005547096122322624,0.0003470666509123452,0.00021778293254731739,0.00013692473741724035,8.61974199558567e-05,5.430804975101775e-05,3.423441420247442e-05,2.15877397033261e-05
0.001,0.0007162564863033777,0.0005540149359610161,0.00034638130244054916,0.00021725376605180745,0.00013655275859741984,8.594765729366703e-05,5.4144492290891566e-05,3.412884781322755e-05,2.152019085117201e-05
0.001,0.0007155708232884887,0.0005533244933430584,0.0003457006374485156,0.00021672846242622396,0.00013618360456808432,8.569983764497563e-05,5.3982226354801364e-05,3.40241228175218e-05,2.1453183528407172e-05
0.001,0.0007148907167777357,0.0005526398589811358,0.0003450262214786548,0.00021620823613271921,0.00013581813150424676,8.545453691240582e-05,5.3821629494988794e-05,3.392048307301558e-05,2.1386873841072776e-05
0.001,0.0007142161543980302,0.0005519610151552632,0.0003443580235484482,0.00021569305634208547,0.00013545631457844443,8.521173706397784e-05,5.366268933409295e-05,3.381792035746172e-05,2.1321256433336487e-05
0.001,0.0007135471238866448,0.0005512879443055973,0.0003436960129838173,0.0002151828925541902,0.0001350981292399717,8.497142027417112e-05,5.350539363884576e-05,3.371642654533412e-05,2.1256326012778444e-05
0.001,0.0007128836130908273,0.0005506206290316834,0.00034304015941680915,0.00021467771459500972,0.00013474355121214092,8.473356892178238e-05,5.3349730318534455e-05,3.361599360677474e-05,2.1192077349695405e-05
0.001,0.0007122256099675188,0.0005499590520918091,0.0003423904327834519,0.00021417749261385993,0.00013439255648970008,8.449816558787534e-05,5.319568742351694e-05,3.35166136065783e-05,2.1128505276425763e-05
0.001,0.0007115731025829938,0.0005493031964022937,0.0003417468033215544,0.0002136821970805245,0.000134045121336186,8.426519305371512e-05,5.304325314373989e-05,3.341827870317759e-05,2.106560468667675e-05
0.001,0.0007109261960066054,0.0005486531617838624,0.0003411093543337103,0.00021319188469384628,0.00013370128216574169,8.403467429429362e-05,5.289244191063335e-05,3.3320997960119286e-05,2.1003381278303992e-05
0.001,0.0007102848782749661,0.0005480089311096272,0.00034047805604549785,0.00021270652596543237,0.00013336101530442401,8.380659214968773e-05,5.274324196034732e-05,3.3224763568979684e-05,2.0941829967612013e-05
0.001,0.0007096491375319776,0.0005473704874075498,0.00033985287897724074,0.00021222609171923644,0.00013302429733989257,8.358092965463258e-05,5.25956416646764e-05,3.312956781229619e-05,2.088094573050621e-05
0.001,0.0007090189620285115,0.0005467378138598193,0.00033923379394201156,0.00021175055308892372,0.0001326911051189623,8.335767003660405e-05,5.244962952967474e-05,3.3035403062615115e-05,2.0820723601860106e-05
0.001,0.0007083951884833238,0.0005461117507284293,0.0003386216233705354,0.00021128054172409337,0.00013236188112429926,8.31371097341464e-05,5.230539940125761e-05,3.294239432192892e-05,2.076124352066865e-05
0.001,0.0007077778041323896,0.000545492279490185,0.00033801633474888146,0.00021081602540817874,0.00013203659950671687,8.291923002160208e-05,5.216293844781483e-05,3.285053307562121e-05,2.0702499944560498e-05
0.001,0.0007071667963482699,0.0005448793818164008,0.0003374178959240363,0.00021035697230232543,0.00013171523473119512,8.270401240613943e-05,5.202223399957759e-05,3.2759810917439646e-05,2.064448740210184e-05
0.001,0.0007065621526397901,0.000544273039572169,0.0003368262751014692,0.00020990335094223987,0.0001313977615739679,8.249143862546502e-05,5.188327354697137e-05,3.267021954836586e-05,2.0587200492045967e-05
0.001,0.0007059638606517004,0.0005436732348155853,0.0003362414408426963,0.00020945513023505862,0.00013108415511962746,8.228149064554578e-05,5.174604473897535e-05,3.258175077549588e-05,2.053063388259103e-05
0.001,0.0007053719081643225,0.0005430799497970297,0.00033566336206289793,0.00020901227945626015,0.00013077439075827684,8.20741506583782e-05,5.161053538152209e-05,3.249439651094783e-05,2.047478231065629e-05
0.001,0.0007047863993885064,0.0005424932828039034,0.0003350921191971394,0.0002085748525953015,0.00013046850282623395,8.186944018288875e-05,5.147675893062123e-05,3.240816518060804e-05,2.0419651063027786e-05
0.001,0.0007042073221500205,0.000541913216142546,0.0003345276813035574,0.00020814281911618103,0.00013016646689064054,8.166734155142674e-05,5.134470329367606e-05,3.232304876615549e-05,2.0365234922821375e-05
0.001,0.0007036346644028755,0.0005413397323015136,0.0003339700177764314,0.00020771614883326046,0.00012986825880927205,8.146783731136239e-05,5.121435652738549e-05,3.2239039349161415e-05,2.0311528738515718e-05
0.001,0.0007030684142289592,0.0005407728139509093,0.00033341909834398085,0.00020729481190839792,0.00012957385472790145,8.12709102230124e-05,5.1085706836262186e-05,3.215612911007561e-05,2.0258527423278803e-05
0.001,0.0007025087877125606,0.0005402126735385767,0.0003328751197405316,0.00020687895394469412,0.00012928335419699167,8.107662593993734e-05,5.095879672189383e-05,3.2074345280702784e-05,2.0206248321016987e-05
0.001,0.0007019557729111361,0.0005396592936234858,0.0003323380514212155,0.00020646854484108668,0.0001289967331620245,8.088496708343894e-05,5.083361429641059e-05,3.1993679981452625e-05,2.0154686306347033e-05
0.001,0.0007014093580122255,0.0005391126569487217,0.00033180786317787807,0.00020606355484577673,0.00012871396785738722,8.069591648818549e-05,5.071014781993386e-05,3.191412543168724e-05,2.010383631860697e-05
0.001,0.0007008695313331482,0.0005385727464408199,0.0003312845251369297,0.00020566395455347188,0.0001284350348038258,8.050945720021523e-05,5.058838569914163e-05,3.1835673948741706e-05,2.0053693361205354e-05
0.001,0.0007003362813206957,0.0005380395452091099,0.00033076800775717,0.00020526971490259695,0.00012815991080588224,8.032557247492852e-05,5.046831648582724e-05,3.175831794694013e-05,2.0004252500969603e-05
0.001,0.0006998095965508554,0.0005375130365450592,0.00033025828182767485,0.00020488080717254625,0.00012788857294937395,8.014424577511121e-05,5.0349928875481843e-05,3.168204993662801e-05,1.9955508867504938e-05
0.001,0.0006992849713647436,0.000536988737498668,0.0003297510574308719,0.00020449398184933928,0.0001276187643023316,7.996397313508213e-05,5.023224268320585e-05,3.160623916862529e-05,1.9907059627792014e-05
0.001,0.0006987624017369506,0.0005364666423066755,0.0003292463243531191,0.00020410922866516542,0.000127350476544274,7.978474848904117e-05,5.011525373583123e-05,3.153088286679667e-05,1.985890297191875e-05
0.001,0.0006982418836227756,0.0005359467451858974,0.000328744072370431,0.00020372653735498857,0.00012708370136324496,7.960656578019794e-05,4.9998957867578574e-05,3.1455978260416835e-05,1.9811037093701456e-05
0.001,0.0006977234129582083,0.0005354290403332512,0.00032824429124863073,0.00020334589765671668,0.0001268184304559618,7.942941896086744e-05,4.988335092011608e-05,3.138152258420484e-05,1.976346019070644e-05
0.001,0.0006972049031024503,0.0005349114284143175,0.00032774491556384407,0.00020296571741865816,0.00012655354571184963,7.925255773427056e-05,4.976794174339877e-05,3.130719890433304e-05,1.971596949574029e-05
0.001,0.0006966863521517465,0.000534393907423076,0.000327245942795149,0.00020258599425811892,0.00012628904521745982,7.907598070306232e-05,4.965272937294146e-05,3.123300657741713e-05,1.966856458850977e-05
0.001,0.000696167758177353,0.0005338764753221901,0.0003267473703778833,0.00020220672575398438,0.00012602492703077633,7.889968645020544e-05,4.95377128311886e-05,3.1158944951577065e-05,1.9621245043263798e-05
0.001,0.0006956491192256274,0.0005333591300431401,0.0003262491957040711,0.00020182790944721542,0.00012576118918167348,7.872367353931904e-05,4.942289112776892e-05,3.108501336660957e-05,1.957401042890837e-05
0.001,0.0006951304333180151,0.0005328418694862771,0.0003257514161227785,0.00020144954284132072,0.00012549782967232552,7.854794051499734e-05,4.9308263259716635e-05,3.1011211154138606e-05,1.9526860309103978e-05
1 0.001 0 km 0.0007537739940510926 7 km 0.0005921033539224395 10 km 0.000384643453726324 20 km 0.00024710943492700773 30 km 0.00015765779381207088 40 km 0.00010015276356884663 50 km 6.345008665672524e-05 60 km 4.012925332336102e-05 70 km 2.535268958174273e-05 80 km
2 0.001 0.0007532443480762404 0.0007539177767305848 0.0005915606741358828 0.0005922648034750569 0.00038408573214392957 0.00038490617279658137 0.00024666764094038643 0.000247392320543982 0.00015734224135307426 0.00015791555306607623 9.993879038586218e-05 0.0001003671566373715 6.330912140259024e-05 6.361853747449743e-05 4.003794165686942e-05 4.0256607010916584e-05 2.529414108865862e-05 2.5446360651215025e-05
3 0.001 0.0007527148738848327 0.0007533902419958185 0.0005910183036445593 0.0005917244917926066 0.0003835286706438232 0.0003843504806873478 0.0002462265418760313 0.0002469518485683003 0.00015702726304657165 0.0001576007478372822 9.972523988324127e-05 0.00010015356028336005 6.316844848796591e-05 6.347773727057954e-05 3.994682503096186e-05 4.016534974386181e-05 2.5235719950422228e-05 2.5387814123899557e-05
4 0.001 0.0007521855703345118 0.0007528628792251897 0.0005904762413907948 0.0005911844879166931 0.00038297226807207136 0.0003837954443648265 0.0002457861365766504 0.0002465120671477305 0.00015671285789580896 0.00015728651344926157 9.9512111295817e-05 9.994038442151031e-05 6.302806736731544e-05 6.333722806950528e-05 3.985590307420444e-05 4.007428674216739e-05 2.5177425921282973e-05 2.5329394519652018e-05
5 0.001 0.0007516564362539944 0.0007523356872805944 0.0005899344862777934 0.0005906447907925071 0.00038241652320864807 0.0003832410626787123 0.0002453464238190796 0.0002460729751307637 0.00015639902485083639 0.00015697284891103737 9.929940381972637e-05 9.972762829117227e-05 6.288797746852316e-05 6.319700932883725e-05 3.976517539750482e-05 3.9983417636365086e-05 2.511925874398998e-05 2.5271101593906498e-05
6 0.001 0.0007511274704431355 0.0007518086649950493 0.0005893930371697809 0.0005901053993262767 0.0003818614347679428 0.0003826873344129807 0.0002449074023149522 0.000245634571300401 0.00015608576280913723 0.00015665975317873245 9.908711661290977e-05 9.95152910932062e-05 6.27481781932559e-05 6.305708047968383e-05 3.967464159435973e-05 3.9892742039402306e-05 2.5061218149955632e-05 2.5212935090640287e-05
7 0.001 0.0007505986716729718 0.0007512818111727442 0.0005888518928921378 0.0005895663123854124 0.00038130700139925517 0.00038213425828639575 0.0002444690707113658 0.0002451968543747938 0.00015577307061625246 0.0001563472251561599 9.887524879560432e-05 9.930337199043154e-05 6.260866891731864e-05 6.291744092702573e-05 3.958430124109855e-05 3.980225954686196e-05 2.5003303859417958e-05 2.5154894742516358e-05
8 0.001 0.0007500678710880661 0.0007507551245890757 0.0005883088511431218 0.0005890275287986403 0.000380751009486411 0.0003815818329529933 0.0002440296996901373 0.00024475982300791935 0.00015545972380501664 0.00015603526369546326 9.866297459432463e-05 9.909187010814736e-05 6.246890748950651e-05 6.277809005009466e-05 3.949380391318895e-05 3.9711969737226656e-05 2.4945291488462056e-05 2.5096980271060998e-05
9 0.001 0.0007495350705096461 0.0007502264452226824 0.0005877639154939723 0.0005884868559085152 0.000380193466563788 0.00038102785262825065 0.00024358929686534952 0.00024432175277214066 0.00015514572847430736 0.00015572264698517112 9.8450298405315e-05 9.88799609470651e-05 6.232889690863924e-05 6.26384862087587e-05 3.9403151593579556e-05 3.9621522312922004e-05 2.4887182324516918e-05 2.5038967246912867e-05
10 0.001 0.0007490002717484986 0.000749695774901522 0.0005872170894971442 0.0005879442972710813 0.00037963438011605534 0.00038047232480109013 0.00024314786979147204 0.00024388265123925605 0.00015483109067004745 0.00015540938109456906 9.823722458416644e-05 9.866764888521257e-05 6.218864014470764e-05 6.249863239143498e-05 3.931234624568946e-05 3.953091925128679e-05 2.4828977642138712e-05 2.498085695464162e-05
11 0.001 0.0007484634766050366 0.0007491631154430714 0.000586668376686434 0.0005873998564236413 0.0003790737575785661 0.00037991525691100856 0.00024270542596389042 0.00024344252592185564 0.0001545158163857142 0.00015509547204033507 9.802375744622405e-05 9.845493826021018e-05 6.204814013916893e-05 6.235853155787194e-05 3.9221389813611975e-05 3.944016251022327e-05 2.4770678703146694e-05 2.4922650665997884e-05
12 0.001 0.0007479199274773811 0.0007486284686543365 0.0005861128912299699 0.0005868535368848297 0.0003785065486556895 0.00037935665634847824 0.00024225795000622747 0.00024300138427382333 0.0001541970308568484 0.00015478092578703268 9.780794472023814e-05 9.824183336966692e-05 6.190610951865765e-05 6.2218186639435e-05 3.9129447888412384e-05 3.9349254028404254e-05 2.471175028700643e-05 2.4864349640052216e-05
13 0.001 0.0007473696306726699 0.0007480870957031576 0.0005855506450602122 0.000586300474032492 0.0003779327791658341 0.00037879149123861057 0.00024180546890527417 0.0002425552230413961 0.0001538747562360148 0.00015446287448415177 9.758980264023896e-05 9.80263854642033e-05 6.176255947727244e-05 6.207631182945079e-05 3.903652792388679e-05 3.925735993392708e-05 2.4652197254708885e-05 2.4805418700342044e-05
14 0.001 0.0007468125926679213 0.0007475390029192987 0.0005849816503235855 0.0005857406797529387 0.0003773524752207052 0.0003782197872436036 0.00024134800990073543 0.00024210406905347345 0.00015354901486124996 0.00015414134016629157 9.736934756691086e-05 9.780861070114894e-05 6.161750129261558e-05 6.193291827596257e-05 3.8942637427869684e-05 3.9164487654400794e-05 2.459202450185328e-05 2.4745862693628148e-05
15 0.001 0.0007462488201102061 0.0007469841968019674 0.0005844059193804029 0.0005851741661454001 0.00037676566322402907 0.0003776415703174324 0.00024088560048334876 0.00024164794939077438 0.0001532198292542639 0.0001538163450528885 9.714659598616437e-05 9.758852536415706e-05 6.147094632476142e-05 6.178801721036571e-05 3.884778396152801e-05 3.907064467141267e-05 2.4531236958179027e-05 2.4685686501265697e-05
16 0.001 0.0007456783198168171 0.0007464226840200367 0.0005838234648047683 0.0005846009455219824 0.00037617236987025305 0.00037705686670463337 0.00024041826839299018 0.0002411868913840224 0.00015288722211863548 0.0001534879115464833 9.692156450770277e-05 9.736614586183658e-05 6.132290601522212e-05 6.164161994641891e-05 3.875197513865345e-05 3.897583851984993e-05 2.4469839587096592e-05 2.462489503874857e-05
17 0.001 0.0007451010987754332 0.0007458544714121565 0.0005832342993844907 0.0005840210304075477 0.0003755726221432343 0.00037646570293897594 0.0002399460416167659 0.00024072092261200308 0.00015255121633799497 0.00015315606223087128 9.66942698635831e-05 9.714148872627883e-05 6.11733918859104e-05 6.149373787917076e-05 3.8655218624953314e-05 3.888007678716513e-05 2.4407837385217267e-05 2.45634932552282e-05
18 0.001 0.0007445173992825126 0.0007452795659868886 0.0005826386743528757 0.0005834344335395587 0.00037496668540476865 0.00037586810584214404 0.00023946913369259697 0.0002402500708997022 0.00015221196586566552 0.000152820819869329 9.646481704279825e-05 9.691457061165131e-05 6.102247334575324e-05 6.134438248396139e-05 3.85575594785277e-05 3.878336711269497e-05 2.4345259282747418e-05 2.450148613305654e-05
19 0.001 0.0007439272282773631 0.0007446982091229053 0.0005820366023339485 0.0005828414050804809 0.0003743545861363169 0.00037526433980072227 0.00023898757201912962 0.0002397745491251193 0.00015186949307274757 0.0001524823380310375 9.623322238874437e-05 9.668549630724793e-05 6.0870161643097905e-05 6.119362307821724e-05 3.845900518061352e-05 3.868575452092861e-05 2.4282110155051444e-05 2.4438902597094615e-05
20 0.001 0.0007433305928659832 0.0007441104077793266 0.0005814280961601982 0.0005822419576041865 0.00037373635109929905 0.000374654431136991 0.0002385013842326201 0.00023929438452844706 0.0001515238205025659 0.0001521406389697796 9.599950236146117e-05 9.645428208068799e-05 6.071646810276464e-05 6.10414708650461e-05 3.835956326175255e-05 3.858724646752558e-05 2.4218394908993806e-05 2.4375747508899864e-05
21 0.001 0.0007427275003211868 0.0007435161690815189 0.0005808131688724332 0.0005816361038919765 0.0003731120073337174 0.0003740384064517259 0.00023801059820498021 0.00023880960458647735 0.0001511749708688244 0.00015179574511101 9.576367353617374e-05 9.622094431596755e-05 6.05614041249978e-05 6.0887937123913e-05 3.825924130107498e-05 3.848785045741014e-05 2.4154118482464792e-05 2.4312025761525238e-05
22 0.001 0.0007421180800523362 0.0007429155003212045 0.0005801919587229117 0.0005810238569324259 0.00037248171070273063 0.0003734162926228523 0.0002375153439047009 0.00023832023701067176 0.00015082303982525373 0.00015144767905002232 9.55258019540184e-05 9.598549951201614e-05 6.0405013700224733e-05 6.073303320960556e-05 3.815806798909622e-05 3.83875740440667e-05 2.4089299350133826e-05 2.42477422790523e-05
23 0.001 0.0007415023395254894 0.0007423085305088799 0.0005795644789202474 0.0005804053544492479 0.00037184548827748576 0.00037278824495395505 0.0002370156491221818 0.0002378264113599139 0.00015046804996987382 0.00015109653618969462 9.528590408468248e-05 9.574801357389848e-05 6.0247308147258e-05 6.057680304696976e-05 3.8056050847170796e-05 3.828644589147927e-05 2.4023942410771268e-05 2.4182915529390252e-05
24 0.001 0.0007408802863797739 0.0007416952671281527 0.000578930742889133 0.0005797806095975203 0.00037120336741830446 0.0003721542903540935 0.00023651154189285886 0.000237328155265129 0.00015011002407818366 0.00015074233901078615 9.504399651802114e-05 9.550850289594038e-05 6.008829886368558e-05 6.041925791001213e-05 3.7953197447440844e-05 3.8184473495775654e-05 2.395805259559495e-05 2.411755039775751e-05
25 0.001 0.0007402519284274773 0.0007410757178351933 0.00057829076427012 0.0005791496357472955 0.0003705553757730914 0.0003715144560199718 0.00023600305049498863 0.00023682549660121693 0.0001497489851010917 0.00015038511017095082 9.480009596242987e-05 9.526698399235154e-05 5.992799732470356e-05 6.026040915139781e-05 3.784951541204015e-05 3.8081664403831414e-05 2.389163486774317e-05 2.4051651801815565e-05
26 0.001 0.0007396172736541335 0.0007404498904588522 0.0005776445569193926 0.0005785124464833875 0.0003699015412757306 0.0003708687694343879 0.000235490203447419 0.00023631846348487102 0.00014938495616282697 0.00015002487250269267 9.455421924320194e-05 9.502347349561174e-05 5.976641508193571e-05 6.0100268201280124e-05 3.774501241228877e-05 3.797802621247342e-05 2.38246942217421e-05 2.3985224691142176e-05
27 0.001 0.0007389763302186035 0.000739817793000736 0.0005769921349085269 0.0005778690556051271 0.00036924189214444916 0.0003702172583646133 0.00023497302950733012 0.00023580708427235972 0.00014901796055883247 0.00014966164901128063 9.4306383300876e-05 9.477798815483971e-05 5.960356376224896e-05 5.9938846566140114e-05 3.763969616788547e-05 3.787356656768574e-05 2.37572356829714e-05 2.3918274046705576e-05
28 0.001 0.000738329973009011 0.0007391794336352683 0.0005763343882557762 0.0005772194771261406 0.00036857732657886674 0.00036955995086080306 0.00023445223185895243 0.00023529138755728292 0.00014864849677321228 0.00014929546287266413 9.40569245366171e-05 9.453054483414699e-05 5.943966431343476e-05 5.977615582759686e-05 3.753370952478887e-05 3.776829316380097e-05 2.3689350732036766e-05 2.385080488032797e-05
29 0.001 0.0007376782088319843 0.0007385356837401969 0.0005756713289449496 0.0005765645972068202 0.0003679078688863157 0.00036889774196575574 0.00023392783529630037 0.0002347720745464529 0.00014827658488585004 0.00014892681149659162 9.38058575472753e-05 9.42814794200372e-05 5.927472675087035e-05 5.9612416728092556e-05 3.7427059131368685e-05 3.7662348796962334e-05 2.362104369630353e-05 2.378290869241134e-05
30 0.001 0.0007370210446325295 0.0007378865501365786 0.0005750029691304239 0.0005759044277808471 0.000367233543593211 0.0003682306558404449 0.00023339986479263558 0.0002342491698918279 0.00014790224510292775 0.00014855571485941296 9.355319701349314e-05 9.403080644324396e-05 5.910876114408311e-05 5.944763924389705e-05 3.7319751670569666e-05 3.755574009362634e-05 2.3552318925085614e-05 2.371458979861065e-05
31 0.001 0.0007363584874940915 0.0007372320397833855 0.0005743293211369546 0.0005752389809515306 0.0003665543754437431 0.00036755871686373843 0.00023286834549865966 0.00023372269842386576 0.00014752549775524457 0.0001481821930634036 9.329895769838934e-05 9.377854051813779e-05 5.8941777615809794e-05 5.92818334053861e-05 3.721179385927125e-05 3.74484737148236e-05 2.348318078922229e-05 2.364585253654512e-05
32 0.001 0.0007356906659117175 0.0007365721597776102 0.0005736505214206793 0.0005745682689916729 0.00036587051603697917 0.0003668819496311701 0.00023233340267585003 0.00023319268514975972 0.00014714643450378646 0.00014780626633511263 9.30432026577021e-05 9.352469634142839e-05 5.8773818072131705e-05 5.911500929610015e-05 3.710321298927822e-05 3.734055635551828e-05 2.3413646846771747e-05 2.35767012653732e-05
33 0.001 0.0007350175870680764 0.0007359070382096695 0.0005729665823498456 0.0005738924278329212 0.00036518198995355594 0.00036620050520582223 0.00023179506120909636 0.0002326592549483615 0.00014676507541963834 0.00014742802610623578 9.278594644638945e-05 9.326933684741753e-05 5.8604892484780656e-05 5.8947208765596136e-05 3.699401567385024e-05 3.723201528626343e-05 2.3343721399750524e-05 2.3507153539330125e-05
34 0.001 0.000734339258284937 0.0007352366822744919 0.0005722775164633901 0.0005732114697907263 0.0003644888219905243 0.0003655144080205807 0.00023125334615855053 0.0002321224325628545 0.0001463814406964208 0.00014704749234532768 9.252720370024704e-05 9.30124765259338e-05 5.8435010877524154e-05 5.877844174725213e-05 3.688420855938328e-05 3.712285709891949e-05 2.327340877117354e-05 2.3437213649054356e-05
35 0.001 0.0007336556870231954 0.0007345610993055855 0.0005715833364706749 0.0005725254073502257 0.00036379103715988533 0.0003648236827235576 0.00023070828275766533 0.00023158224291094424 0.00014599555064848363 0.00014666468514311576 9.226698913450141e-05 9.275412994749425e-05 5.82641833251609e-05 5.860871822644595e-05 3.677379832472749e-05 3.701308841848994e-05 2.320271330460301e-05 2.336688590620212e-05
36 0.001 0.0007329668808828947 0.0007338802967751745 0.0005708840552512191 0.0005718342531661053 0.00036308866068712113 0.0003641283541767086 0.00023015989641122435 0.00023103871108296522 0.00014560742570909416 0.00014627962471074844 9.200531754239911e-05 9.249431176193324e-05 5.8092419952513674e-05 5.843804823954878e-05 3.666279168050168e-05 3.690271590243443e-05 2.313163936369656e-05 2.32961746429929e-05
37 0.001 0.000732272847603227 0.0007331942822941306 0.0005701796858544125 0.0005711380200622195 0.000362381718009681 0.000363428447454292 0.0002296082126933358 0.00023049186233985435 0.00014521708642859763 0.00014589233137793237 9.174220379377606e-05 9.223303669696582e-05 5.791973093340874e-05 5.826644187292669e-05 3.6551195368400524e-05 3.679174623998899e-05 2.3060191331749373e-05 2.3225084211761806e-05
38 0.001 0.0007315751779154508 0.0007325030636119942 0.0005694718366517781 0.000570436721031382 0.00036167180797618383 0.0003627239878414387 0.00022905447155647377 0.00022994172211121704 0.00014482540661409508 0.00014550282559116622 9.147823538482221e-05 9.197031955679165e-05 5.774650123146614e-05 5.809390926192732e-05 3.643925790598459e-05 3.66801861514784e-05 2.2988528215049473e-05 2.3153618984504423e-05
39 0.001 0.0007308738763564251 0.0007318082249846354 0.0005687605159526348 0.000569731957456593 0.00036095894758939165 0.0003620165686744435 0.00022849869020493823 0.0002293895269980944 0.00014443240010265552 0.0001451119793900387 9.121342232553745e-05 9.170674702405544e-05 5.7572737692798364e-05 5.792083507086079e-05 3.6326983828340116e-05 3.656828410642266e-05 2.2916652961499898e-05 2.3081938026911105e-05
40 0.001 0.0007301689475478705 0.0007311097709589727 0.0005680457321686527 0.0005690237376093709 0.00036024315397386176 0.0003613062068501535 0.00022794088593578913 0.00022883529410468975 0.00014403808079282816 0.00014471980653999792 9.094777466478586e-05 9.14423290636205e-05 5.739844718775089e-05 5.774722611940683e-05 3.6214377685641065e-05 3.6456044625219865e-05 2.2844568528419092e-05 2.3010044279099164e-05
41 0.001 0.0007294603961963875 0.0007304077061664716 0.0005673274938137002 0.0005683120698629669 0.0003595244443750873 0.00036059291938656614 0.00022738107613769066 0.00022827904062761942 0.00014364246264358423 0.00014432632086784533 9.068130248947494e-05 9.117707567918865e-05 5.72236366103174e-05 5.757308925149413e-05 3.610144404275241e-05 3.6343472243382366e-05 2.2772277882278848e-05 2.293794069062729e-05
42 0.001 0.0007287502876018436 0.0007297020353231152 0.0005666079096289159 0.0005675969626922158 0.00035880496633647314 0.0003598767234219355 0.00022682095171468864 0.00022772078385475435 0.00014324674865159545 0.00014393153626068395 9.041481948469436e-05 9.091099691249356e-05 5.7048841153261715e-05 5.739843133472259e-05 3.598852922211342e-05 3.6230571511141116e-05 2.270000293927642e-05 2.2865630220232028e-05
43 0.001 0.0007280386231103084 0.0007289948155254126 0.0005658869826353605 0.0005668805157203741 0.0003580847262718071 0.00035915975887038315 0.00022626051891339797 0.00022716220982550104 0.00014285094367250402 0.00014353665302637602 9.014832907727154e-05 9.064490513205597e-05 5.687406312117876e-05 5.722378701487135e-05 3.587563473352017e-05 3.611768859725593e-05 2.2627744673782604e-05 2.279333481077374e-05
44 0.001 0.0007273254041056322 0.0007282860481242219 0.0005651647158992671 0.0005661627319510184 0.00035736373064750184 0.0003584420321019746 0.00022569978402038908 0.00022660332474955334 0.00014245505258865028 0.0001431416759965279 8.988183471111395e-05 9.037880375071969e-05 5.669930482943582e-05 5.7049158588914064e-05 3.5762762093538084e-05 3.6004825007582225e-05 2.2555504064421286e-05 2.2721055434706506e-05
45 0.001 0.0007266106320094578 0.0007275757345080665 0.0005644411125319691 0.0005654436144326382 0.00035664198598218 0.00035772354953912867 0.00022513875336164715 0.0002260441348764214 0.0001420590803085807 0.00014274661002939483 8.961533984682783e-05 9.011269619839399e-05 5.652456860390248e-05 5.687454836459578e-05 3.564991282531874e-05 3.5891982254752056e-05 2.2483282093948716e-05 2.2648793068745655e-05
46 0.001 0.000725894308281204 0.0007268638761030398 0.0005637161756897977 0.0005647231662585116 0.0003559194988462394 0.0003570043176561602 0.00022457743330201225 0.0002254846464948739 0.00014166303176654256 0.0001423514600093734 8.934884796133105e-05 8.984658592167178e-05 5.634985678067539e-05 5.6699958660169715e-05 3.5537088458413665e-05 3.5779161857992474e-05 2.2411079749130865e-05 2.2576548693746487e-05
47 0.001 0.0007251764344180624 0.0007261504743729061 0.0005629899085739927 0.0005640013905666712 0.00035519627586142176 0.00035628434297892044 0.0002240158302446243 0.0002249248659324104 0.00014126691192198565 0.00014195623084652692 8.90823625474685e-05 8.958047638345721e-05 5.6175171705805915e-05 5.652539180412445e-05 3.542429052859005e-05 3.5666365342942064e-05 2.233889802062196e-05 2.250432329458613e-05
48 0.001 0.0007244588135748975 0.0007254355308190145 0.0005622641246704724 0.0005632782905397587 0.00035447409591105305 0.00035556363208430486 0.0002234553120905153 0.00022436479955468554 0.00014087167955905718 0.0001415609274760624 8.881652603390643e-05 8.931437106256734e-05 5.600093342830372e-05 5.635085013490999e-05 3.531178983274928e-05 3.5553594241465086e-05 2.2266910019981595e-05 2.2432117860037706e-05
49 0.001 0.000723741443178776 0.0007247208411865314 0.000561538821268995 0.0005625556717890254 0.0003537529553873339 0.0003548439578507697 0.00022289587522719752 0.00022380581171795803 0.00014047733166655684 0.00014116650687104502 8.855133617099835e-05 8.904891159204534e-05 5.5827140373801375e-05 5.61767534392646e-05 3.519958531186087e-05 3.544111934056619e-05 2.219511505192651e-05 2.2360105593797506e-05
50 0.001 0.0007230243206833482 0.00072400640290786 0.0005608139956950427 0.000561833531609933 0.00035303285074046774 0.00035412531668185007 0.00022233751609917817 0.00022324789882467925 0.00014008386527925162 0.00014077296603347102 8.82867907426191e-05 8.878409573173543e-05 5.565379099102327e-05 5.600310014889176e-05 3.508767592227262e-05 3.5328939584811035e-05 2.212351243120618e-05 2.228828580259237e-05
51 0.001 0.0007223074435688039 0.0007232922134419361 0.0005600896453097011 0.000561111867333509 0.0003523137784782074 0.00035340770503880037 0.00022178023120736695 0.00022269105733400152 0.00013969127747733319 0.00014038030201108317 8.802288756574066e-05 8.8519921274859e-05 5.5480883751481105e-05 5.5829888718494674e-05 3.4976060635503277e-05 3.521705393409239e-05 2.2052101482465692e-05 2.221665780315407e-05
52 0.001 0.0007215926247557181 0.0007225782702742098 0.0005593676122940626 0.0005603906763262448 0.00035159759247597197 0.0003526911194401051 0.00022122546934306127 0.00022213528376118449 0.00013930059415776796 0.00013998851189683077 8.776031848020719e-05 8.825638604758897e-05 5.5308872854303e-05 5.5657117625479614e-05 3.486503301641155e-05 3.510546136342301e-05 2.198107017600086e-05 2.214522092208301e-05
53 0.001 0.0007208798585848073 0.0007218663790349207 0.0005586478889723664 0.0005596717927826706 0.0003508842795507963 0.0003519774072686018 0.0002206732171528304 0.00022158202285215626 0.00013891180440309996 0.0001395986194011808 8.749907547557891e-05 8.79941808494171e-05 5.513775276548628e-05 5.5485240659247415e-05 3.475458937431628e-05 3.499445534348073e-05 2.1910416102241813e-05 2.207416317565271e-05
54 0.001 0.0007201691394257483 0.0007211565340671307 0.000557930467712979 0.000558955209053062 0.00035017382661216696 0.0003512665554090523 0.00022012346138632064 0.0002210312613239567 0.00013852489738482468 0.0001392106136609281 8.723915060881119e-05 8.773329770591506e-05 5.49675179985075e-05 5.531425230770577e-05 3.464472605058592e-05 3.4884032196140665e-05 2.184013687270143e-05 2.200348216114185e-05
55 0.001 0.0007194604616770773 0.0007204487297429265 0.00055721534092818 0.0005582409175317231 0.00034946622066134466 0.00035055855083818805 0.00021957618889536463 0.00022048298599609717 0.00013813986236255893 0.00013882448390129787 8.698053600359808e-05 8.747372870968443e-05 5.4798163113848986e-05 5.514414710600884e-05 3.453543941831367e-05 3.477418827518741e-05 2.177023011975932e-05 2.1933175496831414e-05
56 0.001 0.0007187538197660722 0.0007197429604633029 0.0005565025010739346 0.0005575289106567639 0.00034876144879066544 0.00034985338062403464 0.00021903138663308575 0.00021993718378969884 0.0001377566886832086 0.00013844021943515845 8.672322384971475e-05 8.721546601972457e-05 5.462968271852315e-05 5.497491963609735e-05 3.442672588199151e-05 3.466491996599965e-05 2.1700693496445714e-05 2.1863240821795316e-05
57 0.001 0.0007180492081486484 0.0007190392206580874 0.0005557919406496801 0.0005568191809099186 0.00034805949818288173 0.0003491510319252488 0.0002184890416530366 0.00021939384172660586 0.00013737536578016266 0.00013805780966217872 8.646720640237894e-05 8.695850186076947e-05 5.446207146561145e-05 5.480656452622117e-05 3.431858187719449e-05 3.455622368522282e-05 2.1631524676231647e-05 2.1793675795681418e-05
58 0.001 0.000717348639431565 0.0007183375047857581 0.0005550856739198547 0.0005561117208162645 0.00034736232071304855 0.0003484514919904163 0.00021795064331956514 0.00021885294692850114 0.00013699693247692832 0.00013767724406801954 8.621317757037385e-05 8.670282852265318e-05 5.429578217858938e-05 5.463907645048003e-05 3.421129897003673e-05 3.444809588045186e-05 2.1562909902755936e-05 2.172447809850241e-05
59 0.001 0.0007166521035756881 0.0007176398171146462 0.0005543836868927082 0.0005554085359032386 0.0003466698924934393 0.00034775670623974134 0.00021741616794755068 0.0002183159850558065 0.00013662136971116798 0.00013729955964329822 8.596112351100096e-05 8.644913914890404e-05 5.413080535731451e-05 5.447290801376681e-05 3.410487085131832e-05 3.4340828149382966e-05 2.1494845067789903e-05 2.165583410030806e-05
60 0.001 0.0007159595906065037 0.0007169461476104001 0.0005536859656730149 0.0005547096122322624 0.00034598218983055497 0.0003470666509123452 0.0002168855920630381 0.00021778293254731739 0.0001362486585998701 0.00013692473741724035 8.571103051605296e-05 8.61974199558567e-05 5.396713159578493e-05 5.430804975101775e-05 3.399929127512844e-05 3.423441420247442e-05 2.142732610463052e-05 2.15877397033261e-05
61 0.001 0.0007152710906138687 0.0007162564863033777 0.0005529924964615861 0.0005540149359610161 0.00034529918922366796 0.00034638130244054916 0.00021635889240138666 0.00021725376605180745 0.0001358787804376394 0.00013655275859741984 8.546288501047042e-05 8.594765729366703e-05 5.380475158117202e-05 5.4144492290891566e-05 3.389455405818364e-05 3.412884781322755e-05 2.1360348987661796e-05 2.152019085117201e-05
62 0.001 0.0007145881681833736 0.0007155708232884887 0.0005523048607339887 0.0005533244933430584 0.0003446224616264519 0.0003457006374485156 0.00021583728670966556 0.00021672846242622396 0.00013551259312919557 0.00013618360456808432 8.521726369129195e-05 8.569983764497563e-05 5.364404315662281e-05 5.3982226354801364e-05 3.379090310339315e-05 3.40241228175218e-05 2.129406976339983e-05 2.1453183528407172e-05
63 0.001 0.0007139108109389651 0.0007148907167777357 0.0005516230407004492 0.0005526398589811358 0.0003439519758859039 0.0003450262214786548 0.00021532074399295122 0.00021620823613271921 0.00013515007172518374 0.00013581813150424676 8.497414844816332e-05 8.545453691240582e-05 5.3484993898260945e-05 5.3821629494988794e-05 3.368833016244125e-05 3.392048307301558e-05 2.122848306212633e-05 2.1386873841072776e-05
64 0.001 0.0007132390066148024 0.0007142161543980302 0.0005509470187317473 0.0005519610151552632 0.00034328770115903844 0.0003443580235484482 0.00021480923358720733 0.00021569305634208547 0.0001347911915544671 0.00013545631457844443 8.473352137819455e-05 8.521173706397784e-05 5.3327591526929936e-05 5.366268933409295e-05 3.358682708410006e-05 3.381792035746172e-05 2.1163583577742056e-05 2.1321256433336487e-05
65 0.001 0.0007125727430549207 0.0007135471238866448 0.0005502767773585094 0.0005512879443055973 0.000342629606910633 0.0003436960129838173 0.00021430272515636744 0.0002151828925541902 0.0001344359282214269 0.0001350981292399717 8.449536478383494e-05 8.497142027417112e-05 5.317182390666476e-05 5.350539363884576e-05 3.348638581318404e-05 3.371642654533412e-05 2.109936606707349e-05 2.1256326012778444e-05
66 0.001 0.0007119120082129148 0.0007128836130908273 0.0005496122992705212 0.0005506206290316834 0.0003419776629110174 0.00034304015941680915 0.0002138011886894788 0.00021467771459500972 0.00013408425760331254 0.00013474355121214092 8.425966117078749e-05 8.473356892178238e-05 5.3017679043188334e-05 5.3349730318534455e-05 3.3386998389521964e-05 3.361599360677474e-05 2.1035825349191292e-05 2.1192077349695405e-05
67 0.001 0.000711256790151613 0.0007122256099675188 0.0005489535673160376 0.0005499590520918091 0.0003413318392338714 0.0003423904327834519 0.00021330459449785352 0.00021417749261385993 0.00013373615584760944 0.00013439255648970008 8.40263932459383e-05 8.449816558787534e-05 5.286514508242194e-05 5.319568742351694e-05 3.3288656946938245e-05 3.35166136065783e-05 2.0972956304734848e-05 2.1128505276425763e-05
68 0.001 0.0007106071943639499 0.0007115731025829938 0.0005483006816957998 0.0005493031964022937 0.00034069221933208274 0.0003417468033215544 0.0002128129992904075 0.0002136821970805245 0.00013339165932644894 0.000134045121336186 8.379558393280961e-05 8.426519305371512e-05 5.271423641048183e-05 5.304325314373989e-05 3.31913705135711e-05 3.341827870317759e-05 2.091076460544407e-05 2.106560468667675e-05
69 0.001 0.000709963208882901 0.0007109261960066054 0.0005476536252143895 0.0005486531617838624 0.0003400587732671483 0.0003411093543337103 0.0002123263734210078 0.00021319188469384628 0.00013305074425072359 0.00013370128216574169 8.356721599784782e-05 8.403467429429362e-05 5.256494122003263e-05 5.289244191063335e-05 3.3095131256746724e-05 3.3320997960119286e-05 2.0849245154782437e-05 2.1003381278303992e-05
70 0.001 0.0007093248218486061 0.0007102848782749661 0.0005470123808316875 0.0005480089311096272 0.00033943147139689077 0.00034047805604549785 0.0002118446875576196 0.00021270652596543237 0.00013271338709432742 0.00013336101530442401 8.334127240311385e-05 8.380659214968773e-05 5.241724783997488e-05 5.274324196034732e-05 3.299993143509595e-05 3.3224763568979684e-05 2.0788392916005465e-05 2.0941829967612013e-05
71 0.001 0.0007086920215080653 0.0007096491375319776 0.0005463769316622218 0.0005473704874075498 0.0003388102843733889 0.00033985287897724074 0.00021136791267964032 0.00021222609171923644 0.0001323795645916927 0.00013302429733989257 8.311773630434548e-05 8.358092965463258e-05 5.2271144734051514e-05 5.25956416646764e-05 3.290576339760186e-05 3.312956781229619e-05 2.07282029115292e-05 2.088094573050621e-05
72 0.001 0.0007080656480431051 0.0007090189620285115 0.0005457481216341828 0.0005467378138598193 0.0003381960373995552 0.00033923379394201156 0.00021089668206097172 0.00021175055308892372 0.0001320497200486003 0.0001326911051189623 8.289690449717853e-05 8.335767003660405e-05 5.2126825862102536e-05 5.244962952967474e-05 3.2812752146082854e-05 3.3035403062615115e-05 2.0668755034757233e-05 2.0820723601860106e-05
73 0.001 0.0007074456886869565 0.0007083951884833238 0.0005451259321489777 0.0005461117507284293 0.0003375886977799707 0.0003386216233705354 0.0002104309633113142 0.00021128054172409337 0.00013172382748945162 0.00013236188112429926 8.26787581753205e-05 8.31371097341464e-05 5.198427834496719e-05 5.230539940125761e-05 3.2720889139431744e-05 3.294239432192892e-05 2.061004372929991e-05 2.076124352066865e-05
74 0.001 0.0007068321308093747 0.0007077778041323896 0.0005445103448031184 0.000545492279490185 0.0003369882331820464 0.00033801633474888146 0.00020997072442018424 0.00021081602540817874 0.00013140186125447996 0.00013203659950671687 8.246327876643199e-05 8.291923002160208e-05 5.18434894660219e-05 5.216293844781483e-05 3.2630165945308436e-05 3.285053307562121e-05 2.055206350992823e-05 2.0702499944560498e-05
75 0.001 0.0007062249619162967 0.0007071667963482699 0.0005439013413874698 0.0005448793818164008 0.00033639461163356655 0.0003374178959240363 0.00020951593375373114 0.00021035697230232543 0.00013108379599680725 0.00013171523473119512 8.225044792981545e-05 8.270401240613943e-05 5.170444666951808e-05 5.202223399957759e-05 3.254057423900392e-05 3.2759810917439646e-05 2.0494808961820763e-05 2.064448740210184e-05
76 0.001 0.00070562416964951 0.0007065621526397901 0.0005432989038865089 0.000544273039572169 0.00033580780152024723 0.0003368262751014692 0.000209066560051587 0.00020990335094223987 0.00013076960667953474 0.0001313977615739679 8.204024755412909e-05 8.249143862546502e-05 5.156713755893784e-05 5.188327354697137e-05 3.2452105802317056e-05 3.267021954836586e-05 2.0438274739819433e-05 2.0587200492045967e-05
77 0.001 0.0007050297417863318 0.0007059638606517004 0.0005427030144775926 0.0005436732348155853 0.0003352277715833316 0.0003362414408426963 0.00020862257242375786 0.00020945513023505862 0.00013045926857287288 0.00013108415511962746 8.183265975513502e-05 8.228149064554578e-05 5.143154989537623e-05 5.174604473897535e-05 3.236475252244954e-05 3.258175077549588e-05 2.038245556769746e-05 2.053063388259103e-05
78 0.001 0.0007044417829621171 0.0007053719081643225 0.000542113771820027 0.0005430799497970297 0.0003346546023905152 0.00033566336206289793 0.00020818402485557293 0.00020901227945626015 0.00013015281596227648 0.00013077439075827684 8.162770599537212e-05 8.20741506583782e-05 5.129769708700084e-05 5.161053538152209e-05 3.227852278867728e-05 3.249439651094783e-05 2.032735670561579e-05 2.047478231065629e-05
79 0.001 0.0007038602809995153 0.0007047863993885064 0.0005415311581470623 0.0005424932828039034 0.00033408826282687573 0.0003350921191971394 0.00020775088664703998 0.0002085748525953015 0.00012985022429639665 0.00013046850282623395 8.142536853201701e-05 8.186944018288875e-05 5.116556699709043e-05 5.147675893062123e-05 3.219340855821242e-05 3.240816518060804e-05 2.0272972923816322e-05 2.0419651063027786e-05
80 0.001 0.0007032852238493367 0.0007042073221500205 0.0005409551558747416 0.000541913216142546 0.0003335287221154158 0.0003345276813035574 0.00020732312745044945 0.00020814281911618103 0.00012955146931603386 0.00013016646689064054 8.122562983828357e-05 8.166734155142674e-05 5.103514763884953e-05 5.134470329367606e-05 3.2109401888525124e-05 3.232304876615549e-05 2.0219299058105656e-05 2.0365234922821375e-05
81 0.001 0.0007027165995902542 0.0007036346644028755 0.0005403857476012292 0.0005413397323015136 0.00033297594981485264 0.0003339700177764314 0.00020690071726752732 0.00020771614883326046 0.0001292565270515082 0.00012986825880927205 8.102847260135871e-05 8.146783731136239e-05 5.090642717392409e-05 5.121435652738549e-05 3.202649493632917e-05 3.2239039349161415e-05 2.0166330009182866e-05 2.0311528738515718e-05
82 0.001 0.0007021546252265139 0.0007030684142289592 0.0005398231466905069 0.0005407728139509093 0.00033243014325207994 0.00033341909834398085 0.00020648380199548492 0.00020729481190839792 0.0001289654971719027 0.00012957385472790145 8.083396250547584e-05 8.12709102230124e-05 5.077944809587575e-05 5.1085706836262186e-05 3.194471491165552e-05 3.215612911007561e-05 2.0114083097018264e-05 2.0258527423278803e-05
83 0.001 0.0007015992888126556 0.0007025087877125606 0.0005392673356287205 0.0005402126735385767 0.0003318912717105927 0.0003328751197405316 0.00020607235137144977 0.00020687895394469412 0.0001286783555062261 0.00012928335419699167 8.06420820982489e-05 8.107662593993734e-05 5.065419847368218e-05 5.095879672189383e-05 3.186405391103787e-05 3.2074345280702784e-05 2.006255318369691e-05 2.0206248321016987e-05
84 0.001 0.0007010505785332368 0.0007019557729111361 0.0005387182970867077 0.0005396592936234858 0.00033135930481238495 0.0003323380514212155 0.00020566633548374424 0.00020646854484108668 0.0001283950781739038 0.0001289967331620245 8.04528141416734e-05 8.088496708343894e-05 5.053066652493675e-05 5.083361429641059e-05 3.1784504130324826e-05 3.1993679981452625e-05 2.001173519622426e-05 2.0154686306347033e-05
85 0.001 0.000700508482702546 0.0007014093580122255 0.0005381760139193414 0.0005391126569487217 0.00033083421251577956 0.00033180786317787807 0.00020526572476908743 0.00020606355484577673 0.000128115641582197 0.00012871396785738722 8.026614161010359e-05 8.069591648818549e-05 5.040884061439589e-05 5.071014781993386e-05 3.170605786368809e-05 3.191412543168724e-05 1.9961624125869314e-05 2.010383631860697e-05
86 0.001 0.0006999729897643184 0.0007008695313331482 0.0005376404691648787 0.0005385727464408199 0.00033031596511327947 0.0003312845251369297 0.00020487049000982136 0.00020566395455347188 0.00012784002242364822 0.0001284350348038258 8.008204768824872e-05 8.050945720021523e-05 5.028870925253973e-05 5.058838569914163e-05 3.1628707502639986e-05 3.1835673948741706e-05 1.9912215027513866e-05 2.0053693361205354e-05
87 0.001 0.0006994440882914515 0.0007003362813206957 0.0005371116460443127 0.0005380395452091099 0.0003298045332294241 0.00033076800775717 0.0002044806023311588 0.00020526971490259695 0.0001275681976735486 0.00012815991080588224 7.990051576919067e-05 8.032557247492852e-05 5.0170261094149856e-05 5.046831648582724e-05 3.155244553506268e-05 3.175831794694013e-05 1.9863503019009735e-05 2.0004252500969603e-05
88 0.001 0.0006989172535560769 0.0006998095965508554 0.0005365850419669894 0.0005375130365450592 0.000329295612913881 0.00033025828182767485 0.00020409280438264766 0.00020488080717254625 0.00012729790663346764 0.00012788857294937395 7.972004038787022e-05 8.014424577511121e-05 5.0052515589855926e-05 5.0349928875481843e-05 3.147664135129994e-05 3.168204993662801e-05 1.9815085586326718e-05 1.9955508867504938e-05
89 0.001 0.0006983924815322933 0.0006992849713647436 0.0005360606511477293 0.000536988737498668 0.0003287891938968759 0.0003297510574308719 0.00020370708584067882 0.00020449398184933928 0.00012702914094133737 0.0001276187643023316 7.954061545150935e-05 7.996397313508213e-05 4.993546855036179e-05 5.023224268320585e-05 3.140129216611291e-05 3.160623916862529e-05 1.9766960914662127e-05 1.9907059627792014e-05
90 0.001 0.0006978697681747856 0.0006987624017369506 0.000535538467781285 0.0005364666423066755 0.000328285265898271 0.0003292463243531191 0.00020332343638453147 0.00020410922866516542 0.00012676189224377013 0.000127350476544274 7.936223487646896e-05 7.978474848904117e-05 4.981911579385119e-05 5.011525373583123e-05 3.1326395199731696e-05 3.153088286679667e-05 1.971912719297887e-05 1.985890297191875e-05
91 0.001 0.0006973491094188342 0.0006982418836227756 0.0005350184860423863 0.0005359467451858974 0.0003277838186277228 0.000328744072370431 0.0002029418456965422 0.00020372653735498857 0.0001264961521961901 0.00012708370136324496 7.918489258833681e-05 7.960656578019794e-05 4.970345314604528e-05 4.9998957867578574e-05 3.125194767789152e-05 3.1455978260416835e-05 1.967158261402843e-05 1.9811037093701456e-05
92 0.001 0.0006968284099289676 0.0006977234129582083 0.000534498597351666 0.0005354290403332512 0.00032728277956097635 0.00032824429124863073 0.00020256071739357045 0.00020334589765671668 0.0001262308004979493 0.0001268184304559618 7.900783730702533e-05 7.942941896086744e-05 4.958798911408524e-05 4.988335092011608e-05 3.1177632631488905e-05 3.138152258420484e-05 1.9624124503146986e-05 1.976346019070644e-05
93 0.001 0.0006963076677967887 0.0006972049031024503 0.0005339787996978908 0.0005349114284143175 0.00032678214616920946 0.00032774491556384407 0.00020218004908417888 0.00020296571741865816 0.0001259658352285323 0.00012655354571184963 7.883106763041168e-05 7.925255773427056e-05 4.947272273059253e-05 4.976794174339877e-05 3.110344941552445e-05 3.130719890433304e-05 1.957675243920473e-05 1.971596949574029e-05
94 0.001 0.0006957868810888677 0.0006966863521517465 0.0005334590910383602 0.000534393907423076 0.00032628191587964447 0.000327245942795149 0.00020179983833834103 0.00020258599425811892 0.00012570125443876325 0.00012628904521745982 7.865458213663353e-05 7.907598070306232e-05 4.935765301510161e-05 4.965272937294146e-05 3.102939737649859e-05 3.123300657741713e-05 1.9529465995615212e-05 1.966856458850977e-05
95 0.001 0.0006952660478468047 0.000696167758177353 0.0005329394692990367 0.0005338764753221901 0.0003257820860759608 0.0003267473703778833 0.00020142008268794192 0.00020220672575398438 0.0001254370561512512 0.00012602492703077633 7.847837938443003e-05 7.889968645020544e-05 4.924277897429975e-05 4.95377128311886e-05 3.0955475852573814e-05 3.1158944951577065e-05 1.94822647404421e-05 1.9621245043263798e-05
96 0.001 0.00069474516608728 0.0006956491192256274 0.0005324199323746772 0.0005333591300431401 0.00032528265409871067 0.0003262491957040711 0.0002010407796272818 0.00020182790944721542 0.0001251732383608348 0.00012576118918167348 7.830245791348127e-05 7.872367353931904e-05 4.91280996022673e-05 4.942289112776892e-05 3.088168417373684e-05 3.108501336660957e-05 1.943514823650581e-05 1.957401042890837e-05
97 0.001 0.0006951304333180151 0.0005328418694862771 0.0003257514161227785 0.00020144954284132072 0.00012549782967232552 7.854794051499734e-05 4.9308263259716635e-05 3.1011211154138606e-05 1.9526860309103978e-05

View File

@@ -1,98 +1,99 @@
0.001,0.0007651928200015371,0.0006070713937965498,0.00041423535558437785,0.0002897888610631573,0.00021340907299884933,0.00017198131811953097,0.00016127923791982795,0.00019503601408127412,0.00036549739730595273
0.001,0.0007645995806173374,0.0006064422887178694,0.00041349144049413134,0.00028906380160320487,0.00021270693331134475,0.0001712438796411692,0.0001603765556252246,0.00019363496213474675,0.00036239423700181427
0.001,0.0007640065772643761,0.0006058136176614386,0.00041274866023030733,0.0002883403899406645,0.0002120069527025505,0.00017050944162049183,0.000159478716966613,0.00019224364342300643,0.0003593168093314386
0.001,0.0007634138087852742,0.000605185379478,0.0004120070127662441,0.0002876186224176594,0.00021130912485491145,0.00016977799240843955,0.0001585856969223786,0.00019086199210672448,0.0003562649023666937
0.001,0.0007628028346998721,0.0006045332187986192,0.0004112166712442958,0.0002868226029691562,0.00021050564591298308,0.0001688917074786142,0.00015743651373617922,0.00018893812235512526,0.0003514029291704815
0.001,0.0007621921143131398,0.0006038815297458003,0.00041042762231867933,0.00028602858816935265,0.00020970502628600424,0.00016800982241073787,0.00015629534163924753,0.00018703308452519017,0.00034660591682276115
0.001,0.0007615816463554626,0.0006032303109890501,0.0004096398633263614,0.0002852365728026657,0.00020890725596775628,0.00016713231600712825,0.00015516212643578583,0.00018514669874176095,0.00034187301148734186
0.001,0.0007609692265548555,0.000602577299493926,0.0004088509941253184,0.00028444450359523985,0.00020811064471691694,0.00016625772561605027,0.00015403541161623416,0.00018327705284413884,0.00033720006213702974
0.001,0.0007603548574442921,0.0006019224999904981,0.0004080610253035772,0.00028365239238410656,0.0002073152021201705,0.00016538605339556675,0.00015291517504370476,0.00018142402424673905,0.0003325863766610152
0.001,0.0007597350402439383,0.0006012612395706585,0.0004072600935672035,0.0002828447987841907,0.00020649842223713097,0.00016448344741808307,0.00015174362495246272,0.00017946021794659197,0.00032758319657592714
0.001,0.0007591132829776185,0.0006005982088110791,0.0004064581175876688,0.00028203726728774387,0.00020568299547110922,0.00016358411213968798,0.00015057934813125987,0.00017751539893581778,0.00032265060787650516
0.001,0.000758484736453085,0.0005999283660908604,0.0004056495676510805,0.00028122495212139567,0.00020486486304104927,0.00016268449575399985,0.00014941879820841596,0.00017558496339953558,0.0003177787884410679
0.001,0.0007578494094215417,0.0005992517275730322,0.0004048344831924046,0.000280407904430663,0.00020404408117776887,0.0001617846565020927,0.00014826202727426984,0.00017366890284920263,0.0003129672376410902
0.001,0.0007572073108060312,0.0005985683096346821,0.0004040129039083478,0.0002795861755026316,0.00020322070604404603,0.00016088465224596546,0.00014710908652278506,0.00017176720707727308,0.00030821545426856767
0.001,0.0007565575890478602,0.00059787696153193,0.0004031823074325593,0.00027875567967892653,0.00020238859856737548,0.00015997497741322437,0.00014594324831107206,0.00016984173084389243,0.0003033838449669414
0.001,0.0007559011152632264,0.0005971788697390111,0.00040234530612592536,0.0002779206290242912,0.00020155405878687617,0.00015906535701622418,0.0001447815990558725,0.00016793142878541938,0.0002986152551090434
0.001,0.000755237898986442,0.000596474051424026,0.00040150194087318277,0.00027708107588917086,0.00020071714346489746,0.00015815584855490808,0.00014362418708307366,0.00016603627832169687,0.00029390910930431773
0.001,0.0007545681886825906,0.0005957627683701927,0.00040065250958751827,0.00027623729012494873,0.00019987808563904174,0.00015724665811831285,0.0001424712015659587,0.00016415642490307197,0.0002892651425802985
0.001,0.0007538919937536639,0.0005950450374279253,0.0003997970520738093,0.0002753893223189692,0.00019903693960802692,0.00015633783972296886,0.0001413226854400146,0.00016229183664828758,0.0002846827650697017
0.001,0.0007532045557665671,0.0005943145247994342,0.0003989223236188871,0.00027451662339635243,0.0001981640806362608,0.00015538551594067732,0.00014010540813129958,0.00016028630721570607,0.00027963581042999
0.001,0.0007525106592079478,0.0005935776116184588,0.00039804170193550713,0.0002736399653899091,0.00019728948692008958,0.00015443417816766013,0.00013889388158999866,0.0001582996284854468,0.0002746667454821644
0.001,0.0007518104383956622,0.000592834444449282,0.0003971553683797481,0.0002727595219957832,0.00019641331428482412,0.00015348396557824612,0.00013768822268133468,0.000156331819705631,0.00026977480754699626
0.001,0.0007511039033537896,0.0005920850408658466,0.0003962633635582371,0.00027187534416274955,0.00019553561634171146,0.00015253492870981108,0.00013648846139846028,0.00015438279270990136,0.0002649590347362105
0.001,0.0007503910642803073,0.0005913294186556257,0.0003953657283217157,0.0002709874829437419,0.00019465644657888978,0.0001515871176567501,0.0001352946268320504,0.0001524524582210848,0.0002602184722292356
0.001,0.0007496855573046408,0.0005905851062898704,0.00039449552403657745,0.00027014241927282736,0.0001938361803657908,0.0001507194393001951,0.00013421767536698768,0.000150722476765932,0.0002559376038022294
0.001,0.0007489737467556278,0.0005898345737440663,0.000393619635985906,0.00026929349394052985,0.00019301404332913125,0.00014985216957655317,0.00013314488789598826,0.00014900672746282064,0.00025171693602497907
0.001,0.0007482556429977025,0.0005890778388714725,0.00039273810426086416,0.0002684407562332248,0.0001921900867993824,0.00014898535811302548,0.00013207630234912348,0.00014730517414690737,0.000247555825445753
0.001,0.000747532135526673,0.0005883158165865031,0.0003918519024244402,0.00026758503804540166,0.0001913649895279964,0.00014811957577380352,0.00013101244041258906,0.0001456183389249714,0.00024345460151209766
0.001,0.0007468032330641541,0.0005875485221384682,0.0003909610648762846,0.00026672638132361175,0.0001905387943939666,0.00014725486211264363,0.00012995332641946747,0.00014394616337354944,0.00023941257691738652
0.001,0.0007460689444707028,0.0005867759709451519,0.0003900656262003575,0.00026586482808789615,0.00018971154418348472,0.00014639125636754904,0.00012889898406950181,0.00014228858823944247,0.00023542906884335907
0.001,0.0007453292787585437,0.0005859981786120694,0.0003891656212152682,0.00026500042051039684,0.000188883281693472,0.0001455287975953345,0.000127849436626481,0.0001406455538271199,0.00023150340029334736
0.001,0.0007445843685250069,0.0005852152884984452,0.0003882612223549495,0.00026413331906842847,0.00018805414639063353,0.00014466760638632992,0.00012680478406473458,0.00013901709088191773,0.00022763506393382832
0.001,0.0007438342228409441,0.0005844273161744179,0.0003873524639441998,0.00026326356496406687,0.00018722417962072503,0.0001438077197030893,0.00012576504647438162,0.00013740313489262333,0.00022382338328436597
0.001,0.0007430788509165626,0.0005836342773781009,0.0003864393804873395,0.0002623911994661588,0.00018639342263244998,0.00014294917419819004,0.000124730243348245,0.00013580362065026603,0.00022006768669446508
0.001,0.000742327254060605,0.0005828476385639736,0.00038554300530339766,0.00026154496076193957,0.00018559797011481673,0.0001421370333657246,0.00012375932796391997,0.00013430279846409174,0.00021649152387618443
0.001,0.0007415704350109161,0.0005820559385468977,0.00038464228372291103,0.0002606960153281244,0.00018480150743526303,0.00014132579578003348,0.000122792459010487,0.0001328143978658426,0.0002129659469511457
0.001,0.0007408084031449065,0.0005812591931755618,0.00038373724983374976,0.00025984440338310303,0.0001840040745362742,0.0001405154975809745,0.00012182965960439977,0.00013133837476817992,0.00020949038404752677
0.001,0.0007400427720784002,0.0005804590496942265,0.00038282961864956994,0.0002589915613698488,0.00018320681873232144,0.00013970708155515462,0.00012087177639736769,0.00012987560432955444,0.00020606578076074432
0.001,0.0007392735475065714,0.0005796555183614057,0.00038191941292656456,0.0002581375157328154,0.0001824097650442608,0.00013890056717630873,0.00011991881140841177,0.0001284260094133047,0.00020269149646849757
0.001,0.0007385007352097838,0.0005788486095364762,0.00038100665551987393,0.00025728229294257515,0.00018161293842329387,0.00013809597373520515,0.00011897076635433426,0.0001269895128043655,0.00019936689671873207
0.001,0.0007377243410529983,0.0005780383336785572,0.0003800913693799712,0.0002564259194903244,0.00018081636374445108,0.00013729332033271256,0.00011802764264291933,0.00012556603720150224,0.00019609135315036536
0.001,0.0007369464655998592,0.0005772268587748353,0.0003791758785432219,0.0002555703831979673,0.00018002165393456068,0.00013649394990366146,0.00011709066577140669,0.00012415690240967774,0.0001928666431485617
0.001,0.0007361671107233329,0.000576414188654825,0.000378260191109379,0.00025471569177879693,0.0001792288130669198,0.00013569785799734456,0.00011615980704210183,0.00012276198311838844,0.00018969202938803596
0.001,0.0007353862783344302,0.000575600327192691,0.00037734431522203,0.00025386185296321013,0.00017843784520433673,0.00013490504014296103,0.00011523503783001357,0.00012138115492992521,0.0001865667844236815
0.001,0.0007346027258369329,0.0005747835721418604,0.00037642443290667116,0.0002530026346493095,0.000177639416207763,0.0001341012793025371,0.0001142922256260196,0.00011996295037667013,0.00018332302768968173
0.001,0.0007338177018431625,0.0005739656376861859,0.00037550439543261463,0.0002521443237629474,0.00017684294734265143,0.00013330094534015117,0.00011335582519792064,0.00011855974750452474,0.00018013280630154984
0.001,0.0007330312083387708,0.0005731465277735759,0.000374584210907019,0.00025128692777751636,0.0001760484420635206,0.00013250403238709868,0.00011242580398299235,0.00011717140625198769,0.000176995286763841
0.001,0.0007322450716827681,0.0005723280950701311,0.00037366577307640326,0.00025043200586833656,0.00017525712146802507,0.00013171151729665014,0.00011150300328069361,0.00011579873047427355,0.00017391111613739919
0.001,0.0007314592892342591,0.0005715103366354928,0.0003727490765712826,0.00024957954955556494,0.0001744689721973381,0.00013092337604814113,0.00011058736861417956,0.00011444154833756723,0.0001708794064250159
0.001,0.0007306738583803173,0.0005706932495677312,0.00037183411609277345,0.00024872955044744495,0.00017368398100343736,0.0001301395848004509,0.00010967884595770732,0.00011309968990727626,0.00016789928423747183
0.001,0.0007298887765314699,0.0005698768309963597,0.00037092088639398746,0.0002478820002115871,0.00017290213471209804,0.00012936011984533696,0.0001087773816703527,0.00011177298701463364,0.00016496989019036454
0.001,0.0007291058850619836,0.0005690629705872476,0.0003700113801847071,0.0002470385774678141,0.00017212477134492983,0.0001285860674779147,0.00010788392632853856,0.00011046237940908493,0.00016209217355659912
0.001,0.0007283251776795193,0.0005682516594285885,0.0003691055790623401,0.0002461992575642169,0.00017135185999287266,0.00012781738439880834,0.00010699840217906239,0.00010916766306641233,0.00015926520709064215
0.001,0.000727546648123048,0.000567442888658507,0.0003682034647519281,0.00024536401604150686,0.00017058337001160307,0.00012705402771768452,0.00010612073231230378,0.0001078886367084761,0.00015648808062028533
0.001,0.0007267691175258129,0.0005666351120658079,0.00036730194585451363,0.00024452825978826814,0.00016981299319253088,0.00012628722374912656,0.00010523753204397677,0.00010660034638564814,0.00015369233245141463
0.001,0.0007259937543683618,0.0005658298620581495,0.00036640409142867466,0.00024369656281803695,0.0001690470312136919,0.00012552576286196436,0.00010436224908854787,0.00010532792661952348,0.00015094700928094292
0.001,0.0007252205525006216,0.0005650271299429238,0.0003655098835814395,0.0002428689011484816,0.0001682854538881413,0.00012476960247399048,0.00010349480634605481,0.00010407117393308648,0.00014825118806841486
0.001,0.0007244515476870691,0.0005642289688561167,0.00036462138604045246,0.00024204694758546622,0.00016752954803985582,0.00012401974721449815,0.00010263603739686231,0.00010283083470852359,0.0001456053538142381
0.001,0.0007236867286572494,0.0005634353625294562,0.0003637385663464586,0.00024123066115747858,0.00016677926586679636,0.00012327613591461942,0.00010178584352378332,0.00010160667618634935,0.0001430085413998934
0.001,0.0007229260842094953,0.0005626462948017631,0.0003628613922977866,0.00024042000126051454,0.00016603456004153966,0.00012253870808207087,0.0001009441272602465,0.00010039846917127745,0.000140459805170444
0.001,0.0007221696032014468,0.000561861749604344,0.00036198983191176377,0.0002396149275989645,0.00016529538363567852,0.00012180740380654271,0.00010011079225737115,9.920598777483068e-05,0.00013795821792425024
0.001,0.0007214188723728384,0.00056108334509554,0.0003611255610840681,0.0002388168283348348,0.00016456282140960994,0.00012108307905286178,9.928655238677393e-05,9.802986918413655e-05,0.0001355041849544529
0.001,0.0007206738776295639,0.0005603110603628828,0.0003602685373417506,0.00023802565027806571,0.00016383681258690845,0.00012036565891864721,9.847129356381268e-05,9.686986333449523e-05,0.0001330967445342526
0.001,0.0007199346049934109,0.0005595448746691314,0.00035941871861020354,0.00023724134078502595,0.00016311729706930416,0.00011965506942237431,9.7664903298557e-05,9.57257243308077e-05,0.00013073495556510661
0.001,0.0007192103057281418,0.0005587965882928195,0.000358597914203722,0.00023649404923234267,0.0001624426539507404,0.00011900000933912548,9.693290327537121e-05,9.469853254875163e-05,0.0001286228242214262
0.001,0.0007184916860834766,0.000558054333130965,0.0003577841401235257,0.0002357533416394368,0.00016177407584741055,0.00011835110239617177,9.620855295571759e-05,9.368449216343134e-05,0.0001265476735456528
0.001,0.000717778732645577,0.0005573180893469085,0.0003569773567342285,0.0002350191694371068,0.0001611115088719043,0.00011770828481211398,9.549176022876216e-05,9.268341301362701e-05,0.00012450880618841231
0.001,0.0007170715507844816,0.0005565879566941514,0.0003561776441627035,0.00023429158098135867,0.00016045497378223205,0.00011707155159443024,9.47824835635146e-05,9.169515755193108e-05,0.00012250560759307665
0.001,0.0007163701270344053,0.0005558639152622166,0.0003553849627325309,0.00023357052778616886,0.00015980441694230793,0.00011644083951173604,9.408063218207804e-05,9.071953997714039e-05,0.00012053740486430812
0.001,0.0007156744480415676,0.0005551459453084167,0.00035459927313802623,0.00023285596185845654,0.00015915978530381373,0.00011581608608941654,9.338611653058621e-05,8.975637744384618e-05,0.00011860353870291344
0.001,0.0007149845005557793,0.0005544340272448129,0.0003538205364097734,0.0002321478356456351,0.0001585210263398076,0.00011519722952770958,9.269884816673769e-05,8.880548985453175e-05,0.00011670336266552508
0.001,0.0007143011352806332,0.0005537290222260827,0.0003530496254918224,0.00023144685778402562,0.00015788868071804074,0.00011458468167101622,9.20191492389152e-05,8.786712068874325e-05,0.00011483685132763588
0.001,0.0007136243377311475,0.0005530309085687206,0.00035228649684153725,0.0002307529751854999,0.00015726269010384348,0.00011397837465469773,9.134692457668887e-05,8.694108196461404e-05,0.00011300335424584403
0.001,0.0007129540935643617,0.0005523396647985742,0.000351531107363628,0.0002300661353432777,0.0001566429968410848,0.00011337824146720777,9.06820803490277e-05,8.602718880727694e-05,0.00011120223452206596
0.001,0.0007122949300063586,0.0005516609446370161,0.0003507932546232374,0.0002293990178082647,0.00015604454205901748,0.00011280134646728481,9.004396195380538e-05,8.514641523915274e-05,0.00010944396621311202
0.001,0.0007116422850379047,0.0005509890404263221,0.00035006301886912226,0.00022873877079420107,0.00015545216193435095,0.00011223032450910806,8.941277122627028e-05,8.427699754143763e-05,0.00010771649233683978
0.001,0.0007109961448775265,0.0005503239315436604,0.00034934035900275196,0.00022808534468017605,0.00015486580256638324,0.00011166511373672321,8.878842266662507e-05,8.341876815036907e-05,0.00010601922394974779
0.001,0.0007103566138672342,0.0005496657159311855,0.0003486253516297722,0.00022743878433373037,0.00015428548213839886,0.00011110570832676001,8.81708780194749e-05,8.25716070442755e-05,0.00010435164299643007
0.001,0.0007097236782517396,0.0005490143729973408,0.0003479179557857281,0.0002267990403962617,0.0001537111471536449,0.00011055204708289399,8.756005313455197e-05,8.173535064610718e-05,0.0001027131817052566
0.001,0.0007090973244087274,0.0005483698823458906,0.00034721813091834777,0.000226166064037726,0.00015314274472297157,0.00011000406955950422,8.695586501935841e-05,8.090983803329783e-05,0.00010110328401062253
0.001,0.0007084775388425413,0.0005477322237660661,0.0003465258368613831,0.00022553980691704316,0.00015258022251510344,0.00010946171600087524,8.635823175652435e-05,8.00949107862898e-05,9.952140501322636e-05
0.001,0.0007078645400735427,0.0005471016129101978,0.0003458412757255009,0.00022492042013778988,0.00015202368335334558,0.00010892504915290583,8.57671759148139e-05,7.929051589048381e-05,9.796715152670613e-05
0.001,0.0007072583145347741,0.0005464780293804963,0.00034516440688163317,0.00022430785483116316,0.0001514730744232032,0.00010839400891826328,8.518261565996433e-05,7.84964968569563e-05,9.643999410136803e-05
0.001,0.0007066588487940405,0.000545861452976259,0.0003444951901125997,0.00022370206265319418,0.00015092834351042303,0.00010786853593723236,8.460447028623623e-05,7.771269974698105e-05,9.493941424410264e-05
0.001,0.0007060768113835355,0.0005452653567881146,0.00034385780916102886,0.0002231355522451839,0.0001504295746545273,0.00010739737531972382,8.409424224945842e-05,7.702434963545377e-05,9.360618912201228e-05
0.001,0.0007055014939207988,0.0005446762036784223,0.00034322791998477503,0.0002225755642266546,0.00014993632274793293,0.00010693123855410087,8.358951092264173e-05,7.634435339541097e-05,9.22944227993744e-05
0.001,0.0007049328836329239,0.0005440939744776738,0.0003426054850001757,0.00022202205441602206,0.000149448541485554,0.00010647007505716636,8.309021096715739e-05,7.567259318109089e-05,9.100372969350909e-05
0.001,0.0007043664108869901,0.0005435140913972429,0.00034198598587466614,0.00022147141590047654,0.00014896349766232102,0.00010601178096740148,8.259459730216135e-05,7.500736724232048e-05,8.973176442333615e-05
0.001,0.0007038020712072354,0.0005429365478183962,0.00034136940918446675,0.0002209236320980648,0.00014848117283038098,0.00010555633431743894,8.210263744821714e-05,7.434860458126827e-05,8.847824135377829e-05
0.001,0.0007032398600991381,0.0005423613371043419,0.00034075574151016483,0.0002203786864681782,0.00014800154862415601,0.00010510371328265478,8.161429921011451e-05,7.369623501807121e-05,8.724287943554497e-05
0.001,0.0007026797730466592,0.0005417884525961108,0.00034014496942632764,0.0002198365624959981,0.00014752460674093983,0.00010465389615779026,8.112955064604149e-05,7.305018913687007e-05,8.602540201539488e-05
0.001,0.0007021196874055633,0.0005412157406692665,0.0003395348927353949,0.00021929545761274023,0.00014704895219343257,0.00010420578859113516,8.064746506639534e-05,7.240953347459202e-05,8.482441661675139e-05
0.001,0.0007015596012323657,0.0005406431992153213,0.0003389255082691921,0.00021875536780717296,0.00014657457987728414,0.00010375938295149973,8.016802726693694e-05,7.17742234562459e-05,8.363970356449741e-05
0.001,0.0007009995125587165,0.0005400708260946051,0.0003383168128172846,0.00021821628903476192,0.00014610148467187763,0.0001033146716169485,7.969122211456026e-05,7.114421486558773e-05,8.247104609297546e-05
0.001,0.000700426120570031,0.0005394817717340144,0.00033767827777106695,0.00021763678242090514,0.00014557802543177205,0.00010280805245363877,7.913535785684264e-05,7.040274681183516e-05,8.111172191387726e-05
0.001,0.0006998527383823768,0.0005388929110101418,0.0003370405259007354,0.00021705847496470142,0.00014505616500334602,0.00010230367256069614,7.858312049704058e-05,6.966868896041247e-05,7.977423771714316e-05
0.0010496228983614124,0.002020602352332682,0.0024834354692445607,0.004712247621156641,0.00854174709233096,0.015197203876184536,0.027142477151470907,0.049749449744480465,0.09589624880110185,0.2
0.004235602571438949,0.007336805952289255,0.008714058005603317,0.015024716476258112,0.025061770718850837,0.04079161627542227,0.0649508755581543,0.10074574737193842,0.14993445055894863,0.206
0 km,7 km,10 km,20 km,30 km,40 km,50 km,60 km,70 km,80 km
0.001,0.0007654185419972524,0.0006073276056093792,0.0004146475603472041,0.0002902671662170687,0.00021391771777705748,0.0001725335650783217,0.0001619576961300996,0.00019613348481478226,0.00036856555154569
0.001,0.0007648265274364283,0.0006066999211698721,0.00041390447843586643,0.00028954214777674505,0.00021321488386807227,0.000171794621873672,0.00016105212098646378,0.00019472570335261124,0.00036543839103292923
0.001,0.00076423475082742,0.0006060726714187721,0.00041316253063080743,0.0002888187769396436,0.00021251421079625184,0.0001710586847350929,0.00016015140443848455,0.0001933277019274264,0.0003623371672096105
0.001,0.0007636432110143774,0.0006054458552058583,0.0004124217148997164,0.0002880970500399001,0.00021181569222935437,0.00017032574197864756,0.00015925552136261768,0.00019193941431515274,0.0003592616661738057
0.001,0.00076303338083269,0.0006047950045143256,0.0004116319711720434,0.0002873006965446473,0.00021101094555209704,0.00016943701776024394,0.00015810165194844262,0.00019000410483730154,0.00035435344277520014
0.001,0.0007624238065102939,0.0006041446264165162,0.00041084352013847123,0.0002865063493191246,0.0002102090638489634,0.00016855270795343295,0.00015695583271993784,0.000188087762219128,0.00034951092824224374
0.001,0.0007618144867783217,0.0006034947195801519,0.00041005635912737644,0.00028571400313117073,0.000209410037075066,0.00016767279125308264,0.000155818009114819,0.0001861902048930817,0.00034473325633896016
0.001,0.0007612032230964268,0.0006028430274261829,0.0004092680923152776,0.00028492160640338084,0.00020861217469969167,0.00016679580316719344,0.00015468672086849377,0.00018430951195784153,0.0003400162401556392
0.001,0.0007605900180176352,0.0006021895546863309,0.000408478730269415,0.00028412917095061395,0.00020781548628341263,0.00016592174578786424,0.0001535619455802766,0.00018244555944842464,0.000335359176825339
0.001,0.0007599713504055552,0.0006015295991965402,0.0004076783487865176,0.0002833211587561824,0.00020699731581240013,0.00016501652229006483,0.00015238542164450143,0.000180469716663273,0.00033030742335106797
0.001,0.0007593507507343548,0.0006008678808679657,0.00040687692763931326,0.0002825132124386522,0.00020618050489600874,0.00016411458466993175,0.0001512162128542595,0.00017851301079839705,0.00032532712476693115
0.001,0.0007587233815624382,0.0006001993719156019,0.00040606894689472706,0.0002817004901671922,0.0002053609939218913,0.0001632123763493078,0.00015005076311129325,0.00017657081573262424,0.0003204083683965919
0.001,0.0007580892517126006,0.0005995240885208491,0.0004052544459439752,0.0002808830430533993,0.00020453883912382008,0.0001623099555953223,0.0001488891244397257,0.00017464312199372379,0.0003155506430768726
0.001,0.000757448370179369,0.0005988420470784952,0.00040443346443882024,0.0002800609223493252,0.00020371409666633197,0.00016140738029416416,0.00014773134796391561,0.00017272991838834854,0.0003107534371554913
0.001,0.0007567998780637095,0.00059815208713495,0.0004036034596839685,0.0002792300099339312,0.0002028805779162198,0.0001604950646725177,0.00014656055358564036,0.0001707926621492761,0.00030587527063737443
0.001,0.0007561446539823046,0.0005974554049330684,0.00040276706435836743,0.0002783945504517164,0.00020204463288750894,0.00015958281494627715,0.00014539398266818048,0.00016887071348766508,0.00030106092293455183
0.001,0.0007554827075416216,0.0005967520176577599,0.00040192431930056663,0.00027755459621831854,0.00020120631834502002,0.0001586706886366497,0.00014423168344504801,0.00016696404870095068,0.0002963098069760517
0.001,0.0007548142866478835,0.0005960421864035,0.00040107552190864405,0.000276710416864016,0.00020036586735025836,0.00015775889202640647,0.00014307384532883863,0.00016507281278915244,0.00029162164835553234
0.001,0.0007541394007727726,0.0005953259280357876,0.00040022071194032425,0.0002758620629396957,0.00019952333420039184,0.0001568474791446172,0.00014192051114461952,0.000163196972716382,0.0002869958456117749
0.001,0.000753453261276124,0.0005945968692177485,0.0003993465628625302,0.0002749888554209862,0.00019864889698783253,0.00015589225679197793,0.00014069786108208423,0.00016117883466097707,0.0002818995386546663
0.001,0.0007527606830746849,0.0005938614307668164,0.00039846653446453577,0.00027411169702333635,0.00019777273283424246,0.00015493803621995225,0.00013948100714945055,0.00015917971666279146,0.00027688213338452353
0.001,0.000752061800251107,0.000593119758904669,0.0003975808078042764,0.0002732307613051971,0.00019689499757748,0.00015398495670235495,0.00013827006619590224,0.00015719963654088831,0.0002719428500764955
0.001,0.0007513566228984858,0.0005923718712186205,0.00039668942343994645,0.00027234609917798486,0.0001960157448213401,0.0001530330687596212,0.0001370650679700252,0.0001552385042294358,0.000267080708365827
0.001,0.0007506451612836396,0.000591617785508762,0.0003957924221725467,0.000271457761656054,0.00019513502804513515,0.00015208242246717618,0.00013586604131538964,0.00015329622856198138,0.00026229473523033993
0.001,0.0007499410764512782,0.0005908750616328752,0.0003949229270536377,0.00027061232560569935,0.0001943133661054677,0.00015121214860141992,0.00013478433495717895,0.0001515553239579192,0.0002579720674546429
0.001,0.0007492307077939692,0.0005901261380362599,0.0003940477612542949,0.0002697630351391033,0.0001934898396676657,0.00015034229582385722,0.00013370682839182124,0.00014982878466439454,0.0002537103994437239
0.001,0.0007485140657428474,0.0005893710325813375,0.00039316696481225496,0.0002689099395032721,0.00019266450005914697,0.0001494729137699088,0.00013263355942168804,0.00014811657325897344,0.00024950907434075407
0.001,0.0007477920374988207,0.0005886106575770754,0.00039228150952041026,0.0002680538698732277,0.00019183802609277662,0.00014860457389983926,0.00013156505071301006,0.00014641921273032577,0.00024536841469387607
0.001,0.0007470646318417684,0.000587845028280153,0.00039139142972943226,0.00026719486815718823,0.00019101046063687028,0.0001477373157547231,0.00013050132642612272,0.00014473664329931894,0.00024128771968956965
0.001,0.000746331857690334,0.0005870741601150847,0.0003904967599732611,0.0002663329763359202,0.00019018184646592208,0.0001468711785583918,0.00012944241008601634,0.0001430688043627681,0.00023726629318772418
0.001,0.000745593724114763,0.0005862980686936137,0.0003895975350198339,0.0002654682365419898,0.00018935222636504533,0.00014600620135329296,0.00012838832478192589,0.0001414156348862137,0.00023330344508078714
0.001,0.0007448503634609417,0.0005855168970231048,0.00038869392700388675,0.0002646008091121948,0.00018852173980288115,0.00014514250481571783,0.00012733917050730646,0.00013977716467553823,0.00022939865638927297
0.001,0.0007441017848559784,0.0005847306606783223,0.0003877859701983709,0.00026373073520765555,0.0001876904281105713,0.0001442801258881357,0.00012629496716723198,0.0001381533278738466,0.00022555123779529113
0.001,0.000743347997566111,0.0005839393754013221,0.00038687369905472224,0.00026285805605533836,0.00018685833252122952,0.0001434191012016364,0.000125255734067765,0.0001365440579330561,0.0002217605049922782
0.001,0.0007425980122165197,0.0005831545190886928,0.0003859781684512971,0.00026201154253776947,0.00018606159531590292,0.00014260456502787665,0.00012428053620243385,0.0001350337902936029,0.00021815009586241928
0.001,0.0007418428222422646,0.0005823646190291856,0.00038507830193089523,0.00026116232813230903,0.0001852638537460305,0.00014179094397584395,0.00012330941740530514,0.00013353605951814913,0.000214590937375532
0.001,0.0007410824370750857,0.0005815696910727474,0.00038417413352571667,0.0002603104530145326,0.00018446514774054143,0.00014097827417406666,0.00012234240064855456,0.00013205082038162874,0.00021108244611026217
0.001,0.0007403184660014679,0.0005807713776603622,0.0003832673750805624,0.0002594573523562161,0.0001836666246937272,0.00014016749938812904,0.00012138033426810311,0.00013057895028626532,0.00020762556561303502
0.001,0.0007395509147560407,0.0005799696890514251,0.0003823580493090658,0.0002586030525652665,0.00018286830960336872,0.00013935863904919696,0.00012042322007081454,0.00012912037080446074,0.00020421964337946413
0.001,0.0007387797891584386,0.0005791646356057247,0.0003814461790231548,0.0002577475800751799,0.00018207022739706005,0.00013855171240478834,0.00011947105956106815,0.0001276750034397535,0.00020086403326178727
0.001,0.0007380050951127038,0.000578356227782297,0.00038053178712941366,0.00025689096133950617,0.0001812724029256328,0.00013774673851177748,0.00011852385393388548,0.0001262427696188339,0.00019755809538624924
0.001,0.0007372289278765602,0.0005775466274590334,0.00037961719344922816,0.00025603518246549605,0.00018047644930614432,0.00013694506185961904,0.00011758283148187963,0.00012482499369662246,0.0001943036135491255
0.001,0.0007364512893389424,0.0005767358384619004,0.0003787024060562486,0.0002551802511391958,0.00017968237057615404,0.0001361466779099092,0.00011664796319397039,0.00012342154884218158,0.00019109983808810176
0.001,0.0007356721814267267,0.0005759238646613067,0.0003777874330677233,0.0002543261750635963,0.00017889017076266666,0.00013535158210437542,0.00011571922013388507,0.00012203230915507028,0.00018794602945024216
0.001,0.0007348903474707337,0.0005751089853685418,0.00037686841880625214,0.0002534666634479025,0.00017809042928748983,0.00013454542482553396,0.00011477223754870921,0.00012060527355137842,0.0001846722184263047
0.001,0.0007341070502230424,0.0005742929332546843,0.0003759492523595486,0.00025260806222015907,0.0001772926545344648,0.0001337427099649026,0.00011383170595735486,0.00011919336498115804,0.00018145260378874068
0.001,0.0007333222916846016,0.0005734757122629472,0.0003750299418068227,0.0002517503788238516,0.00017649684991694604,0.00013294343155185963,0.00011289759243683735,0.00011779644164652425,0.00017828633792123003
0.001,0.0007325378931581444,0.0005726591695542582,0.00037411237735305734,0.00025089517102575937,0.00017570423657326553,0.00013214856737581396,0.00011197073980433406,0.0001164153090011861,0.00017517406255147756
0.001,0.0007317538520017976,0.0005718433021851622,0.00037319655361857124,0.00025004243032543557,0.00017491480109484205,0.00013135809328305347,0.0001110510931582075,0.00011504979334922632,0.00017211487548789828
0.001,0.0007309701656016873,0.0005710281072505973,0.0003722824652942578,0.0002491921483105776,0.0001741285301842189,0.000130571985300518,0.00011013859805243972,0.00011369972292133188,0.00016910788945367707
0.001,0.0007301868313673829,0.0005702135818768351,0.00037137010712276296,0.0002483443166280691,0.00017334541061775574,0.0001297902195887095,0.00010923320042963165,0.00011236492773944517,0.00016615223146969552
0.001,0.0007294056858799279,0.0005694016103111181,0.00037046146816096116,0.0002475006124214696,0.00017256678052747222,0.0001290138836109195,0.0001083358528422491,0.00011104635018836138,0.0001632488500459303
0.001,0.0007286267228265342,0.0005685921836368309,0.00036955653001307385,0.0002466610110284357,0.00017179260894632618,0.00012824293390221287,0.00010744647704539295,0.00010974378427192081,0.00016039680402653037
0.001,0.0007278499359259242,0.0005677852929874075,0.0003686552744110329,0.000245825487979439,0.00017102286517266867,0.00012747732740860064,0.00010656499564424898,0.00010845702677323144,0.00015759516965436614
0.001,0.0007270741396329974,0.0005669793834682747,0.00036775459243596013,0.0002449894231786493,0.00017025120181982169,0.00012670823171859124,0.00010567792500018758,0.00010716091111285436,0.00015477474449137119
0.001,0.000726300509089127,0.0005661759961906673,0.0003668575707603942,0.00024415741777526555,0.00016948395998088835,0.00012594449635600327,0.000104798812682607,0.00010588078664841973,0.00015200532201362785
0.001,0.0007255290381246482,0.0005653751224576382,0.0003659641914980988,0.00024332944777626794,0.00016872110941070693,0.00012518607857232714,0.00010392758109688598,0.00010461644792633948,0.00014928596543342006
0.001,0.0007247617567123682,0.0005645788092050789,0.0003650765144822908,0.0002425071844547339,0.00016796393694001768,0.00012443398389681975,0.0001030650652169494,0.00010336864256044427,0.00014661715384500229
0.001,0.0007239986535454607,0.0005637870401634551,0.0003641945072810511,0.0002416905868396016,0.00016721239470100498,0.00012368815096486452,0.00010221116577265065,0.00010213713571582715,0.00014399790845116419
0.001,0.0007232397173862652,0.0005629997991705343,0.0003633181377200508,0.00024087961432750444,0.00016646643530137355,0.0001229485190910589,0.00010136578475280116,0.00010092169616032506,0.00014142727026178776
0.001,0.00072248493705675,0.0005622170701566371,0.0003624473738436701,0.00024007422662323307,0.0001657260117481481,0.0001222150281737581,0.00010052882527084345,9.972209600365954e-05,0.000138904299062937
0.001,0.0007217358950348228,0.000561440466555814,0.00036158388844431124,0.00023927581064585389,0.0001649922088518066,0.00012148853502428482,9.97010025298723e-05,9.853897375975792e-05,0.00013642939611266722
0.001,0.0007209925771752469,0.0005606699674539418,0.0003607276390906435,0.00023848431321443392,0.00016426496576549843,0.00012076896452456461,9.888220185750974e-05,9.737207727303015e-05,0.00013400158668478175
0.001,0.0007202549694492843,0.0005599055521123883,0.0003598785837495114,0.00023769968169456287,0.0001635442223215586,0.00012005624248053424,9.807231018575002e-05,9.622115859912247e-05,0.0001316199170239902
0.001,0.0007195323462520794,0.0005591590509921624,0.0003590585920958888,0.00023695215697134095,0.00016286848728581805,0.00011939925459233543,9.733714368639992e-05,9.518785816120323e-05,0.00012948993319015237
0.001,0.0007188153904868624,0.0005584185656809617,0.00035824561959240325,0.0002362112130369942,0.00016219882234612553,0.00011874843483873407,9.660966052802588e-05,9.416779973181015e-05,0.00012739732395025585
0.001,0.0007181040886926203,0.0005576840763431772,0.00035743962664792336,0.00023547680133784063,0.00016153517356182933,0.00011810371926813217,9.588976814961258e-05,9.316079161517574e-05,0.00012534138272701054
0.001,0.0007173985458519898,0.0005569556823713467,0.0003566406932084415,0.00023474897015812488,0.0001608775616408074,0.00011746510277705029,9.517742467544867e-05,9.216669491688869e-05,0.00012332148630987257
0.001,0.0007166987484521553,0.0005562333638566226,0.00035584877964252954,0.00023402767102794237,0.00016022593289484238,0.00011683252196707568,9.447253888812898e-05,9.118532235085734e-05,0.00012133695300052025
0.001,0.0007160046830928351,0.0005555171010581067,0.00035506384668924896,0.00023331285597027454,0.00015958023422419515,0.00011620591419889337,9.377502080118898e-05,9.021648961473911e-05,0.0001193871149139895
0.001,0.0007153163364777631,0.0005548068743897313,0.0003542858554234702,0.00023260447744820426,0.00015894041305074621,0.00011558521750971036,9.308478154551746e-05,8.926001517936315e-05,0.00011747131722415646
0.001,0.0007146345569433116,0.0005541035424399441,0.0003535156771553805,0.00023190324345165713,0.00015830701004295562,0.00011497084410199294,9.240214376206843e-05,8.831614266750221e-05,0.00011558953011398195
0.001,0.0007139593299513231,0.0005534070835269872,0.0003527532683936443,0.00023120910091256188,0.0001576799668132194,0.0001143627259393922,9.172701183766888e-05,8.738468264977303e-05,0.00011374109491336212
0.001,0.0007132906411062882,0.000552717476178626,0.00035199858609393853,0.00023052199734406963,0.00015705922565321226,0.00011376079584113645,9.105929150577112e-05,8.646544883197101e-05,0.0001119253667056674
0.001,0.0007126330184449588,0.0005520403753247726,0.0003512614302897459,0.0002298546155988536,0.00015645973111213718,0.0001131821199461313,9.041832213305081e-05,8.557937250804453e-05,0.00011015252685143603
0.001,0.000711981898998139,0.0005513700720769836,0.0003505318788510462,0.00022919410061472063,0.0001558663157908185,0.00011260933085632868,8.978431049296584e-05,8.47047300887107e-05,0.00010841080451458245
0.001,0.0007113372689341813,0.0005507065458152156,0.0003498098907291114,0.00022854040278969112,0.00015527892573799634,0.00011204236655473188,8.91571706762786e-05,8.384135267939557e-05,0.00010669960309782175
0.001,0.0007106992322019796,0.0005500498941226498,0.0003490955423571875,0.00022789356692450827,0.00015469757908825738,0.00011148122111140715,8.85368641132709e-05,8.298911908997276e-05,0.00010501839736063321
0.001,0.0007100677749962943,0.0005494000964108962,0.0003483887928208825,0.00022725354367970012,0.00015412222229517684,0.0001109258331719869,8.792330625417495e-05,8.214786445649906e-05,0.00010336661223747767
0.001,0.0007094428836454011,0.0005487571322870243,0.0003476896016176379,0.00022662028424420426,0.00015355280242059424,0.00011037614213504096,8.731641371338838e-05,8.131742659415625e-05,0.00010174368455214035
0.001,0.000708824544604701,0.0005481209815436059,0.0003469979286303459,0.00022599374029548395,0.00015298926708448145,0.00010983208809074389,8.671610418600222e-05,8.049764584384383e-05,0.0001001490624678555
0.001,0.0007082129757140411,0.0005474918591435615,0.0003463139755716002,0.00022537406278014643,0.00015243171907300512,0.00010929373376222763,8.612240008214866e-05,7.968846833775761e-05,9.858234685897841e-05
0.001,0.000707608163356494,0.0005468697446924577,0.00034563770186245746,0.00022476120284855867,0.000151880105523236,0.00010876101889898551,8.55352191851817e-05,7.888973637819775e-05,9.704300162684373e-05
0.001,0.0007070100940503908,0.0005462546179930401,0.0003449690673354809,0.0002241551121757662,0.0001513343741731098,0.00010823388399029377,8.495448041312896e-05,7.810129484091103e-05,9.553050179700698e-05
0.001,0.0007064294568015821,0.0005456599791780414,0.0003443323098548347,0.00022358838010950836,0.00015083471987353974,0.00010776122599922914,8.444190686735427e-05,7.7408734986085e-05,9.418640444056476e-05
0.001,0.0007058555225588962,0.0005450722639773927,0.0003437030311737585,0.0002230281662249932,0.00015034058581471813,0.00010729360256509277,8.39348527119689e-05,7.67245852554126e-05,9.28639870067709e-05
0.001,0.0007052882785030611,0.0005444914532267761,0.0003430811937591523,0.00022247442636251605,0.00014985192565331347,0.00010683096298015644,8.343325230960875e-05,7.604872690242875e-05,9.156285904414627e-05
0.001,0.0007047231683832071,0.0005439129831785586,0.00034246228783126086,0.00022192355689618922,0.00014936600614401393,0.00010637120139586071,8.293535717958106e-05,7.537945268589432e-05,9.028066182205625e-05
0.001,0.0007041601877072604,0.0005433368472132987,0.00034184629997988753,0.0002213755412469509,0.00014888280881520869,0.00010591429577334988,8.244113465160048e-05,7.471669094184598e-05,8.901710564172274e-05
0.001,0.0007035993319644686,0.0005427630386936696,0.0003412332167993905,0.00022083036287728357,0.0001484023152778868,0.00010546022421726945,8.195055234184008e-05,7.406037083397318e-05,8.777190547391773e-05
0.001,0.0007030405966226531,0.0005421915509602746,0.00034062302487816926,0.00022028800527546067,0.00014792450720603156,0.00010500896495215848,8.146357812174912e-05,7.341042229889045e-05,8.65447807653603e-05
0.001,0.000702481864866424,0.0005416202367428493,0.000340013528083159,0.00021974666745789773,0.00014744798951136416,0.00010455942245749231,8.097928325582809e-05,7.276590831707151e-05,8.53343290345859e-05
0.001,0.0007019231347536531,0.000541049093933996,0.00033940472324505365,0.0002192063454080809,0.00014697275707368812,0.00010411158905958576,8.049765241221972e-05,7.212678380437272e-05,8.414032725111873e-05
0.001,0.0007013644043173649,0.0005404781203952333,0.00033879660715245314,0.0002186670350763442,0.0001464988047567028,0.00010366545709431046,8.001867033124847e-05,7.149300404124133e-05,8.296255535497e-05
0.001,0.0007007923380838431,0.0005398904209305891,0.0003381585602637609,0.00021808716235465733,0.0001459743062317574,0.00010315717126101123,7.946027734643345e-05,7.0747191644443e-05,8.159291401029592e-05
0.001,0.0007002202839606736,0.0005393029161815334,0.0003375212965814363,0.0002175084901000057,0.0001454514108138073,0.00010265113449578299,7.890553328521924e-05,7.000884795811205e-05,8.02453392500888e-05
0.0010564983206625808,0.0020323156209598047,0.0024972245821602065,0.004735193374982383,0.008578320915529132,0.015253393937469889,0.027225142859919765,0.049861478431656114,0.09601482521493776,0.2
0.004249939542299966,0.007357791565894658,0.008737301696751656,0.01505607870396766,0.02510093603015811,0.040835074437955504,0.0649892582783015,0.10076225398432796,0.14991538310282454,0.206
1 0.001 0 km 0.0007651928200015371 7 km 0.0006070713937965498 10 km 0.00041423535558437785 20 km 0.0002897888610631573 30 km 0.00021340907299884933 40 km 0.00017198131811953097 50 km 0.00016127923791982795 60 km 0.00019503601408127412 70 km 0.00036549739730595273 80 km
2 0.001 0.0007645995806173374 0.0007654185419972524 0.0006064422887178694 0.0006073276056093792 0.00041349144049413134 0.0004146475603472041 0.00028906380160320487 0.0002902671662170687 0.00021270693331134475 0.00021391771777705748 0.0001712438796411692 0.0001725335650783217 0.0001603765556252246 0.0001619576961300996 0.00019363496213474675 0.00019613348481478226 0.00036239423700181427 0.00036856555154569
3 0.001 0.0007640065772643761 0.0007648265274364283 0.0006058136176614386 0.0006066999211698721 0.00041274866023030733 0.00041390447843586643 0.0002883403899406645 0.00028954214777674505 0.0002120069527025505 0.00021321488386807227 0.00017050944162049183 0.000171794621873672 0.000159478716966613 0.00016105212098646378 0.00019224364342300643 0.00019472570335261124 0.0003593168093314386 0.00036543839103292923
4 0.001 0.0007634138087852742 0.00076423475082742 0.000605185379478 0.0006060726714187721 0.0004120070127662441 0.00041316253063080743 0.0002876186224176594 0.0002888187769396436 0.00021130912485491145 0.00021251421079625184 0.00016977799240843955 0.0001710586847350929 0.0001585856969223786 0.00016015140443848455 0.00019086199210672448 0.0001933277019274264 0.0003562649023666937 0.0003623371672096105
5 0.001 0.0007628028346998721 0.0007636432110143774 0.0006045332187986192 0.0006054458552058583 0.0004112166712442958 0.0004124217148997164 0.0002868226029691562 0.0002880970500399001 0.00021050564591298308 0.00021181569222935437 0.0001688917074786142 0.00017032574197864756 0.00015743651373617922 0.00015925552136261768 0.00018893812235512526 0.00019193941431515274 0.0003514029291704815 0.0003592616661738057
6 0.001 0.0007621921143131398 0.00076303338083269 0.0006038815297458003 0.0006047950045143256 0.00041042762231867933 0.0004116319711720434 0.00028602858816935265 0.0002873006965446473 0.00020970502628600424 0.00021101094555209704 0.00016800982241073787 0.00016943701776024394 0.00015629534163924753 0.00015810165194844262 0.00018703308452519017 0.00019000410483730154 0.00034660591682276115 0.00035435344277520014
7 0.001 0.0007615816463554626 0.0007624238065102939 0.0006032303109890501 0.0006041446264165162 0.0004096398633263614 0.00041084352013847123 0.0002852365728026657 0.0002865063493191246 0.00020890725596775628 0.0002102090638489634 0.00016713231600712825 0.00016855270795343295 0.00015516212643578583 0.00015695583271993784 0.00018514669874176095 0.000188087762219128 0.00034187301148734186 0.00034951092824224374
8 0.001 0.0007609692265548555 0.0007618144867783217 0.000602577299493926 0.0006034947195801519 0.0004088509941253184 0.00041005635912737644 0.00028444450359523985 0.00028571400313117073 0.00020811064471691694 0.000209410037075066 0.00016625772561605027 0.00016767279125308264 0.00015403541161623416 0.000155818009114819 0.00018327705284413884 0.0001861902048930817 0.00033720006213702974 0.00034473325633896016
9 0.001 0.0007603548574442921 0.0007612032230964268 0.0006019224999904981 0.0006028430274261829 0.0004080610253035772 0.0004092680923152776 0.00028365239238410656 0.00028492160640338084 0.0002073152021201705 0.00020861217469969167 0.00016538605339556675 0.00016679580316719344 0.00015291517504370476 0.00015468672086849377 0.00018142402424673905 0.00018430951195784153 0.0003325863766610152 0.0003400162401556392
10 0.001 0.0007597350402439383 0.0007605900180176352 0.0006012612395706585 0.0006021895546863309 0.0004072600935672035 0.000408478730269415 0.0002828447987841907 0.00028412917095061395 0.00020649842223713097 0.00020781548628341263 0.00016448344741808307 0.00016592174578786424 0.00015174362495246272 0.0001535619455802766 0.00017946021794659197 0.00018244555944842464 0.00032758319657592714 0.000335359176825339
11 0.001 0.0007591132829776185 0.0007599713504055552 0.0006005982088110791 0.0006015295991965402 0.0004064581175876688 0.0004076783487865176 0.00028203726728774387 0.0002833211587561824 0.00020568299547110922 0.00020699731581240013 0.00016358411213968798 0.00016501652229006483 0.00015057934813125987 0.00015238542164450143 0.00017751539893581778 0.000180469716663273 0.00032265060787650516 0.00033030742335106797
12 0.001 0.000758484736453085 0.0007593507507343548 0.0005999283660908604 0.0006008678808679657 0.0004056495676510805 0.00040687692763931326 0.00028122495212139567 0.0002825132124386522 0.00020486486304104927 0.00020618050489600874 0.00016268449575399985 0.00016411458466993175 0.00014941879820841596 0.0001512162128542595 0.00017558496339953558 0.00017851301079839705 0.0003177787884410679 0.00032532712476693115
13 0.001 0.0007578494094215417 0.0007587233815624382 0.0005992517275730322 0.0006001993719156019 0.0004048344831924046 0.00040606894689472706 0.000280407904430663 0.0002817004901671922 0.00020404408117776887 0.0002053609939218913 0.0001617846565020927 0.0001632123763493078 0.00014826202727426984 0.00015005076311129325 0.00017366890284920263 0.00017657081573262424 0.0003129672376410902 0.0003204083683965919
14 0.001 0.0007572073108060312 0.0007580892517126006 0.0005985683096346821 0.0005995240885208491 0.0004040129039083478 0.0004052544459439752 0.0002795861755026316 0.0002808830430533993 0.00020322070604404603 0.00020453883912382008 0.00016088465224596546 0.0001623099555953223 0.00014710908652278506 0.0001488891244397257 0.00017176720707727308 0.00017464312199372379 0.00030821545426856767 0.0003155506430768726
15 0.001 0.0007565575890478602 0.000757448370179369 0.00059787696153193 0.0005988420470784952 0.0004031823074325593 0.00040443346443882024 0.00027875567967892653 0.0002800609223493252 0.00020238859856737548 0.00020371409666633197 0.00015997497741322437 0.00016140738029416416 0.00014594324831107206 0.00014773134796391561 0.00016984173084389243 0.00017272991838834854 0.0003033838449669414 0.0003107534371554913
16 0.001 0.0007559011152632264 0.0007567998780637095 0.0005971788697390111 0.00059815208713495 0.00040234530612592536 0.0004036034596839685 0.0002779206290242912 0.0002792300099339312 0.00020155405878687617 0.0002028805779162198 0.00015906535701622418 0.0001604950646725177 0.0001447815990558725 0.00014656055358564036 0.00016793142878541938 0.0001707926621492761 0.0002986152551090434 0.00030587527063737443
17 0.001 0.000755237898986442 0.0007561446539823046 0.000596474051424026 0.0005974554049330684 0.00040150194087318277 0.00040276706435836743 0.00027708107588917086 0.0002783945504517164 0.00020071714346489746 0.00020204463288750894 0.00015815584855490808 0.00015958281494627715 0.00014362418708307366 0.00014539398266818048 0.00016603627832169687 0.00016887071348766508 0.00029390910930431773 0.00030106092293455183
18 0.001 0.0007545681886825906 0.0007554827075416216 0.0005957627683701927 0.0005967520176577599 0.00040065250958751827 0.00040192431930056663 0.00027623729012494873 0.00027755459621831854 0.00019987808563904174 0.00020120631834502002 0.00015724665811831285 0.0001586706886366497 0.0001424712015659587 0.00014423168344504801 0.00016415642490307197 0.00016696404870095068 0.0002892651425802985 0.0002963098069760517
19 0.001 0.0007538919937536639 0.0007548142866478835 0.0005950450374279253 0.0005960421864035 0.0003997970520738093 0.00040107552190864405 0.0002753893223189692 0.000276710416864016 0.00019903693960802692 0.00020036586735025836 0.00015633783972296886 0.00015775889202640647 0.0001413226854400146 0.00014307384532883863 0.00016229183664828758 0.00016507281278915244 0.0002846827650697017 0.00029162164835553234
20 0.001 0.0007532045557665671 0.0007541394007727726 0.0005943145247994342 0.0005953259280357876 0.0003989223236188871 0.00040022071194032425 0.00027451662339635243 0.0002758620629396957 0.0001981640806362608 0.00019952333420039184 0.00015538551594067732 0.0001568474791446172 0.00014010540813129958 0.00014192051114461952 0.00016028630721570607 0.000163196972716382 0.00027963581042999 0.0002869958456117749
21 0.001 0.0007525106592079478 0.000753453261276124 0.0005935776116184588 0.0005945968692177485 0.00039804170193550713 0.0003993465628625302 0.0002736399653899091 0.0002749888554209862 0.00019728948692008958 0.00019864889698783253 0.00015443417816766013 0.00015589225679197793 0.00013889388158999866 0.00014069786108208423 0.0001582996284854468 0.00016117883466097707 0.0002746667454821644 0.0002818995386546663
22 0.001 0.0007518104383956622 0.0007527606830746849 0.000592834444449282 0.0005938614307668164 0.0003971553683797481 0.00039846653446453577 0.0002727595219957832 0.00027411169702333635 0.00019641331428482412 0.00019777273283424246 0.00015348396557824612 0.00015493803621995225 0.00013768822268133468 0.00013948100714945055 0.000156331819705631 0.00015917971666279146 0.00026977480754699626 0.00027688213338452353
23 0.001 0.0007511039033537896 0.000752061800251107 0.0005920850408658466 0.000593119758904669 0.0003962633635582371 0.0003975808078042764 0.00027187534416274955 0.0002732307613051971 0.00019553561634171146 0.00019689499757748 0.00015253492870981108 0.00015398495670235495 0.00013648846139846028 0.00013827006619590224 0.00015438279270990136 0.00015719963654088831 0.0002649590347362105 0.0002719428500764955
24 0.001 0.0007503910642803073 0.0007513566228984858 0.0005913294186556257 0.0005923718712186205 0.0003953657283217157 0.00039668942343994645 0.0002709874829437419 0.00027234609917798486 0.00019465644657888978 0.0001960157448213401 0.0001515871176567501 0.0001530330687596212 0.0001352946268320504 0.0001370650679700252 0.0001524524582210848 0.0001552385042294358 0.0002602184722292356 0.000267080708365827
25 0.001 0.0007496855573046408 0.0007506451612836396 0.0005905851062898704 0.000591617785508762 0.00039449552403657745 0.0003957924221725467 0.00027014241927282736 0.000271457761656054 0.0001938361803657908 0.00019513502804513515 0.0001507194393001951 0.00015208242246717618 0.00013421767536698768 0.00013586604131538964 0.000150722476765932 0.00015329622856198138 0.0002559376038022294 0.00026229473523033993
26 0.001 0.0007489737467556278 0.0007499410764512782 0.0005898345737440663 0.0005908750616328752 0.000393619635985906 0.0003949229270536377 0.00026929349394052985 0.00027061232560569935 0.00019301404332913125 0.0001943133661054677 0.00014985216957655317 0.00015121214860141992 0.00013314488789598826 0.00013478433495717895 0.00014900672746282064 0.0001515553239579192 0.00025171693602497907 0.0002579720674546429
27 0.001 0.0007482556429977025 0.0007492307077939692 0.0005890778388714725 0.0005901261380362599 0.00039273810426086416 0.0003940477612542949 0.0002684407562332248 0.0002697630351391033 0.0001921900867993824 0.0001934898396676657 0.00014898535811302548 0.00015034229582385722 0.00013207630234912348 0.00013370682839182124 0.00014730517414690737 0.00014982878466439454 0.000247555825445753 0.0002537103994437239
28 0.001 0.000747532135526673 0.0007485140657428474 0.0005883158165865031 0.0005893710325813375 0.0003918519024244402 0.00039316696481225496 0.00026758503804540166 0.0002689099395032721 0.0001913649895279964 0.00019266450005914697 0.00014811957577380352 0.0001494729137699088 0.00013101244041258906 0.00013263355942168804 0.0001456183389249714 0.00014811657325897344 0.00024345460151209766 0.00024950907434075407
29 0.001 0.0007468032330641541 0.0007477920374988207 0.0005875485221384682 0.0005886106575770754 0.0003909610648762846 0.00039228150952041026 0.00026672638132361175 0.0002680538698732277 0.0001905387943939666 0.00019183802609277662 0.00014725486211264363 0.00014860457389983926 0.00012995332641946747 0.00013156505071301006 0.00014394616337354944 0.00014641921273032577 0.00023941257691738652 0.00024536841469387607
30 0.001 0.0007460689444707028 0.0007470646318417684 0.0005867759709451519 0.000587845028280153 0.0003900656262003575 0.00039139142972943226 0.00026586482808789615 0.00026719486815718823 0.00018971154418348472 0.00019101046063687028 0.00014639125636754904 0.0001477373157547231 0.00012889898406950181 0.00013050132642612272 0.00014228858823944247 0.00014473664329931894 0.00023542906884335907 0.00024128771968956965
31 0.001 0.0007453292787585437 0.000746331857690334 0.0005859981786120694 0.0005870741601150847 0.0003891656212152682 0.0003904967599732611 0.00026500042051039684 0.0002663329763359202 0.000188883281693472 0.00019018184646592208 0.0001455287975953345 0.0001468711785583918 0.000127849436626481 0.00012944241008601634 0.0001406455538271199 0.0001430688043627681 0.00023150340029334736 0.00023726629318772418
32 0.001 0.0007445843685250069 0.000745593724114763 0.0005852152884984452 0.0005862980686936137 0.0003882612223549495 0.0003895975350198339 0.00026413331906842847 0.0002654682365419898 0.00018805414639063353 0.00018935222636504533 0.00014466760638632992 0.00014600620135329296 0.00012680478406473458 0.00012838832478192589 0.00013901709088191773 0.0001414156348862137 0.00022763506393382832 0.00023330344508078714
33 0.001 0.0007438342228409441 0.0007448503634609417 0.0005844273161744179 0.0005855168970231048 0.0003873524639441998 0.00038869392700388675 0.00026326356496406687 0.0002646008091121948 0.00018722417962072503 0.00018852173980288115 0.0001438077197030893 0.00014514250481571783 0.00012576504647438162 0.00012733917050730646 0.00013740313489262333 0.00013977716467553823 0.00022382338328436597 0.00022939865638927297
34 0.001 0.0007430788509165626 0.0007441017848559784 0.0005836342773781009 0.0005847306606783223 0.0003864393804873395 0.0003877859701983709 0.0002623911994661588 0.00026373073520765555 0.00018639342263244998 0.0001876904281105713 0.00014294917419819004 0.0001442801258881357 0.000124730243348245 0.00012629496716723198 0.00013580362065026603 0.0001381533278738466 0.00022006768669446508 0.00022555123779529113
35 0.001 0.000742327254060605 0.000743347997566111 0.0005828476385639736 0.0005839393754013221 0.00038554300530339766 0.00038687369905472224 0.00026154496076193957 0.00026285805605533836 0.00018559797011481673 0.00018685833252122952 0.0001421370333657246 0.0001434191012016364 0.00012375932796391997 0.000125255734067765 0.00013430279846409174 0.0001365440579330561 0.00021649152387618443 0.0002217605049922782
36 0.001 0.0007415704350109161 0.0007425980122165197 0.0005820559385468977 0.0005831545190886928 0.00038464228372291103 0.0003859781684512971 0.0002606960153281244 0.00026201154253776947 0.00018480150743526303 0.00018606159531590292 0.00014132579578003348 0.00014260456502787665 0.000122792459010487 0.00012428053620243385 0.0001328143978658426 0.0001350337902936029 0.0002129659469511457 0.00021815009586241928
37 0.001 0.0007408084031449065 0.0007418428222422646 0.0005812591931755618 0.0005823646190291856 0.00038373724983374976 0.00038507830193089523 0.00025984440338310303 0.00026116232813230903 0.0001840040745362742 0.0001852638537460305 0.0001405154975809745 0.00014179094397584395 0.00012182965960439977 0.00012330941740530514 0.00013133837476817992 0.00013353605951814913 0.00020949038404752677 0.000214590937375532
38 0.001 0.0007400427720784002 0.0007410824370750857 0.0005804590496942265 0.0005815696910727474 0.00038282961864956994 0.00038417413352571667 0.0002589915613698488 0.0002603104530145326 0.00018320681873232144 0.00018446514774054143 0.00013970708155515462 0.00014097827417406666 0.00012087177639736769 0.00012234240064855456 0.00012987560432955444 0.00013205082038162874 0.00020606578076074432 0.00021108244611026217
39 0.001 0.0007392735475065714 0.0007403184660014679 0.0005796555183614057 0.0005807713776603622 0.00038191941292656456 0.0003832673750805624 0.0002581375157328154 0.0002594573523562161 0.0001824097650442608 0.0001836666246937272 0.00013890056717630873 0.00014016749938812904 0.00011991881140841177 0.00012138033426810311 0.0001284260094133047 0.00013057895028626532 0.00020269149646849757 0.00020762556561303502
40 0.001 0.0007385007352097838 0.0007395509147560407 0.0005788486095364762 0.0005799696890514251 0.00038100665551987393 0.0003823580493090658 0.00025728229294257515 0.0002586030525652665 0.00018161293842329387 0.00018286830960336872 0.00013809597373520515 0.00013935863904919696 0.00011897076635433426 0.00012042322007081454 0.0001269895128043655 0.00012912037080446074 0.00019936689671873207 0.00020421964337946413
41 0.001 0.0007377243410529983 0.0007387797891584386 0.0005780383336785572 0.0005791646356057247 0.0003800913693799712 0.0003814461790231548 0.0002564259194903244 0.0002577475800751799 0.00018081636374445108 0.00018207022739706005 0.00013729332033271256 0.00013855171240478834 0.00011802764264291933 0.00011947105956106815 0.00012556603720150224 0.0001276750034397535 0.00019609135315036536 0.00020086403326178727
42 0.001 0.0007369464655998592 0.0007380050951127038 0.0005772268587748353 0.000578356227782297 0.0003791758785432219 0.00038053178712941366 0.0002555703831979673 0.00025689096133950617 0.00018002165393456068 0.0001812724029256328 0.00013649394990366146 0.00013774673851177748 0.00011709066577140669 0.00011852385393388548 0.00012415690240967774 0.0001262427696188339 0.0001928666431485617 0.00019755809538624924
43 0.001 0.0007361671107233329 0.0007372289278765602 0.000576414188654825 0.0005775466274590334 0.000378260191109379 0.00037961719344922816 0.00025471569177879693 0.00025603518246549605 0.0001792288130669198 0.00018047644930614432 0.00013569785799734456 0.00013694506185961904 0.00011615980704210183 0.00011758283148187963 0.00012276198311838844 0.00012482499369662246 0.00018969202938803596 0.0001943036135491255
44 0.001 0.0007353862783344302 0.0007364512893389424 0.000575600327192691 0.0005767358384619004 0.00037734431522203 0.0003787024060562486 0.00025386185296321013 0.0002551802511391958 0.00017843784520433673 0.00017968237057615404 0.00013490504014296103 0.0001361466779099092 0.00011523503783001357 0.00011664796319397039 0.00012138115492992521 0.00012342154884218158 0.0001865667844236815 0.00019109983808810176
45 0.001 0.0007346027258369329 0.0007356721814267267 0.0005747835721418604 0.0005759238646613067 0.00037642443290667116 0.0003777874330677233 0.0002530026346493095 0.0002543261750635963 0.000177639416207763 0.00017889017076266666 0.0001341012793025371 0.00013535158210437542 0.0001142922256260196 0.00011571922013388507 0.00011996295037667013 0.00012203230915507028 0.00018332302768968173 0.00018794602945024216
46 0.001 0.0007338177018431625 0.0007348903474707337 0.0005739656376861859 0.0005751089853685418 0.00037550439543261463 0.00037686841880625214 0.0002521443237629474 0.0002534666634479025 0.00017684294734265143 0.00017809042928748983 0.00013330094534015117 0.00013454542482553396 0.00011335582519792064 0.00011477223754870921 0.00011855974750452474 0.00012060527355137842 0.00018013280630154984 0.0001846722184263047
47 0.001 0.0007330312083387708 0.0007341070502230424 0.0005731465277735759 0.0005742929332546843 0.000374584210907019 0.0003759492523595486 0.00025128692777751636 0.00025260806222015907 0.0001760484420635206 0.0001772926545344648 0.00013250403238709868 0.0001337427099649026 0.00011242580398299235 0.00011383170595735486 0.00011717140625198769 0.00011919336498115804 0.000176995286763841 0.00018145260378874068
48 0.001 0.0007322450716827681 0.0007333222916846016 0.0005723280950701311 0.0005734757122629472 0.00037366577307640326 0.0003750299418068227 0.00025043200586833656 0.0002517503788238516 0.00017525712146802507 0.00017649684991694604 0.00013171151729665014 0.00013294343155185963 0.00011150300328069361 0.00011289759243683735 0.00011579873047427355 0.00011779644164652425 0.00017391111613739919 0.00017828633792123003
49 0.001 0.0007314592892342591 0.0007325378931581444 0.0005715103366354928 0.0005726591695542582 0.0003727490765712826 0.00037411237735305734 0.00024957954955556494 0.00025089517102575937 0.0001744689721973381 0.00017570423657326553 0.00013092337604814113 0.00013214856737581396 0.00011058736861417956 0.00011197073980433406 0.00011444154833756723 0.0001164153090011861 0.0001708794064250159 0.00017517406255147756
50 0.001 0.0007306738583803173 0.0007317538520017976 0.0005706932495677312 0.0005718433021851622 0.00037183411609277345 0.00037319655361857124 0.00024872955044744495 0.00025004243032543557 0.00017368398100343736 0.00017491480109484205 0.0001301395848004509 0.00013135809328305347 0.00010967884595770732 0.0001110510931582075 0.00011309968990727626 0.00011504979334922632 0.00016789928423747183 0.00017211487548789828
51 0.001 0.0007298887765314699 0.0007309701656016873 0.0005698768309963597 0.0005710281072505973 0.00037092088639398746 0.0003722824652942578 0.0002478820002115871 0.0002491921483105776 0.00017290213471209804 0.0001741285301842189 0.00012936011984533696 0.000130571985300518 0.0001087773816703527 0.00011013859805243972 0.00011177298701463364 0.00011369972292133188 0.00016496989019036454 0.00016910788945367707
52 0.001 0.0007291058850619836 0.0007301868313673829 0.0005690629705872476 0.0005702135818768351 0.0003700113801847071 0.00037137010712276296 0.0002470385774678141 0.0002483443166280691 0.00017212477134492983 0.00017334541061775574 0.0001285860674779147 0.0001297902195887095 0.00010788392632853856 0.00010923320042963165 0.00011046237940908493 0.00011236492773944517 0.00016209217355659912 0.00016615223146969552
53 0.001 0.0007283251776795193 0.0007294056858799279 0.0005682516594285885 0.0005694016103111181 0.0003691055790623401 0.00037046146816096116 0.0002461992575642169 0.0002475006124214696 0.00017135185999287266 0.00017256678052747222 0.00012781738439880834 0.0001290138836109195 0.00010699840217906239 0.0001083358528422491 0.00010916766306641233 0.00011104635018836138 0.00015926520709064215 0.0001632488500459303
54 0.001 0.000727546648123048 0.0007286267228265342 0.000567442888658507 0.0005685921836368309 0.0003682034647519281 0.00036955653001307385 0.00024536401604150686 0.0002466610110284357 0.00017058337001160307 0.00017179260894632618 0.00012705402771768452 0.00012824293390221287 0.00010612073231230378 0.00010744647704539295 0.0001078886367084761 0.00010974378427192081 0.00015648808062028533 0.00016039680402653037
55 0.001 0.0007267691175258129 0.0007278499359259242 0.0005666351120658079 0.0005677852929874075 0.00036730194585451363 0.0003686552744110329 0.00024452825978826814 0.000245825487979439 0.00016981299319253088 0.00017102286517266867 0.00012628722374912656 0.00012747732740860064 0.00010523753204397677 0.00010656499564424898 0.00010660034638564814 0.00010845702677323144 0.00015369233245141463 0.00015759516965436614
56 0.001 0.0007259937543683618 0.0007270741396329974 0.0005658298620581495 0.0005669793834682747 0.00036640409142867466 0.00036775459243596013 0.00024369656281803695 0.0002449894231786493 0.0001690470312136919 0.00017025120181982169 0.00012552576286196436 0.00012670823171859124 0.00010436224908854787 0.00010567792500018758 0.00010532792661952348 0.00010716091111285436 0.00015094700928094292 0.00015477474449137119
57 0.001 0.0007252205525006216 0.000726300509089127 0.0005650271299429238 0.0005661759961906673 0.0003655098835814395 0.0003668575707603942 0.0002428689011484816 0.00024415741777526555 0.0001682854538881413 0.00016948395998088835 0.00012476960247399048 0.00012594449635600327 0.00010349480634605481 0.000104798812682607 0.00010407117393308648 0.00010588078664841973 0.00014825118806841486 0.00015200532201362785
58 0.001 0.0007244515476870691 0.0007255290381246482 0.0005642289688561167 0.0005653751224576382 0.00036462138604045246 0.0003659641914980988 0.00024204694758546622 0.00024332944777626794 0.00016752954803985582 0.00016872110941070693 0.00012401974721449815 0.00012518607857232714 0.00010263603739686231 0.00010392758109688598 0.00010283083470852359 0.00010461644792633948 0.0001456053538142381 0.00014928596543342006
59 0.001 0.0007236867286572494 0.0007247617567123682 0.0005634353625294562 0.0005645788092050789 0.0003637385663464586 0.0003650765144822908 0.00024123066115747858 0.0002425071844547339 0.00016677926586679636 0.00016796393694001768 0.00012327613591461942 0.00012443398389681975 0.00010178584352378332 0.0001030650652169494 0.00010160667618634935 0.00010336864256044427 0.0001430085413998934 0.00014661715384500229
60 0.001 0.0007229260842094953 0.0007239986535454607 0.0005626462948017631 0.0005637870401634551 0.0003628613922977866 0.0003641945072810511 0.00024042000126051454 0.0002416905868396016 0.00016603456004153966 0.00016721239470100498 0.00012253870808207087 0.00012368815096486452 0.0001009441272602465 0.00010221116577265065 0.00010039846917127745 0.00010213713571582715 0.000140459805170444 0.00014399790845116419
61 0.001 0.0007221696032014468 0.0007232397173862652 0.000561861749604344 0.0005629997991705343 0.00036198983191176377 0.0003633181377200508 0.0002396149275989645 0.00024087961432750444 0.00016529538363567852 0.00016646643530137355 0.00012180740380654271 0.0001229485190910589 0.00010011079225737115 0.00010136578475280116 9.920598777483068e-05 0.00010092169616032506 0.00013795821792425024 0.00014142727026178776
62 0.001 0.0007214188723728384 0.00072248493705675 0.00056108334509554 0.0005622170701566371 0.0003611255610840681 0.0003624473738436701 0.0002388168283348348 0.00024007422662323307 0.00016456282140960994 0.0001657260117481481 0.00012108307905286178 0.0001222150281737581 9.928655238677393e-05 0.00010052882527084345 9.802986918413655e-05 9.972209600365954e-05 0.0001355041849544529 0.000138904299062937
63 0.001 0.0007206738776295639 0.0007217358950348228 0.0005603110603628828 0.000561440466555814 0.0003602685373417506 0.00036158388844431124 0.00023802565027806571 0.00023927581064585389 0.00016383681258690845 0.0001649922088518066 0.00012036565891864721 0.00012148853502428482 9.847129356381268e-05 9.97010025298723e-05 9.686986333449523e-05 9.853897375975792e-05 0.0001330967445342526 0.00013642939611266722
64 0.001 0.0007199346049934109 0.0007209925771752469 0.0005595448746691314 0.0005606699674539418 0.00035941871861020354 0.0003607276390906435 0.00023724134078502595 0.00023848431321443392 0.00016311729706930416 0.00016426496576549843 0.00011965506942237431 0.00012076896452456461 9.7664903298557e-05 9.888220185750974e-05 9.57257243308077e-05 9.737207727303015e-05 0.00013073495556510661 0.00013400158668478175
65 0.001 0.0007192103057281418 0.0007202549694492843 0.0005587965882928195 0.0005599055521123883 0.000358597914203722 0.0003598785837495114 0.00023649404923234267 0.00023769968169456287 0.0001624426539507404 0.0001635442223215586 0.00011900000933912548 0.00012005624248053424 9.693290327537121e-05 9.807231018575002e-05 9.469853254875163e-05 9.622115859912247e-05 0.0001286228242214262 0.0001316199170239902
66 0.001 0.0007184916860834766 0.0007195323462520794 0.000558054333130965 0.0005591590509921624 0.0003577841401235257 0.0003590585920958888 0.0002357533416394368 0.00023695215697134095 0.00016177407584741055 0.00016286848728581805 0.00011835110239617177 0.00011939925459233543 9.620855295571759e-05 9.733714368639992e-05 9.368449216343134e-05 9.518785816120323e-05 0.0001265476735456528 0.00012948993319015237
67 0.001 0.000717778732645577 0.0007188153904868624 0.0005573180893469085 0.0005584185656809617 0.0003569773567342285 0.00035824561959240325 0.0002350191694371068 0.0002362112130369942 0.0001611115088719043 0.00016219882234612553 0.00011770828481211398 0.00011874843483873407 9.549176022876216e-05 9.660966052802588e-05 9.268341301362701e-05 9.416779973181015e-05 0.00012450880618841231 0.00012739732395025585
68 0.001 0.0007170715507844816 0.0007181040886926203 0.0005565879566941514 0.0005576840763431772 0.0003561776441627035 0.00035743962664792336 0.00023429158098135867 0.00023547680133784063 0.00016045497378223205 0.00016153517356182933 0.00011707155159443024 0.00011810371926813217 9.47824835635146e-05 9.588976814961258e-05 9.169515755193108e-05 9.316079161517574e-05 0.00012250560759307665 0.00012534138272701054
69 0.001 0.0007163701270344053 0.0007173985458519898 0.0005558639152622166 0.0005569556823713467 0.0003553849627325309 0.0003566406932084415 0.00023357052778616886 0.00023474897015812488 0.00015980441694230793 0.0001608775616408074 0.00011644083951173604 0.00011746510277705029 9.408063218207804e-05 9.517742467544867e-05 9.071953997714039e-05 9.216669491688869e-05 0.00012053740486430812 0.00012332148630987257
70 0.001 0.0007156744480415676 0.0007166987484521553 0.0005551459453084167 0.0005562333638566226 0.00035459927313802623 0.00035584877964252954 0.00023285596185845654 0.00023402767102794237 0.00015915978530381373 0.00016022593289484238 0.00011581608608941654 0.00011683252196707568 9.338611653058621e-05 9.447253888812898e-05 8.975637744384618e-05 9.118532235085734e-05 0.00011860353870291344 0.00012133695300052025
71 0.001 0.0007149845005557793 0.0007160046830928351 0.0005544340272448129 0.0005555171010581067 0.0003538205364097734 0.00035506384668924896 0.0002321478356456351 0.00023331285597027454 0.0001585210263398076 0.00015958023422419515 0.00011519722952770958 0.00011620591419889337 9.269884816673769e-05 9.377502080118898e-05 8.880548985453175e-05 9.021648961473911e-05 0.00011670336266552508 0.0001193871149139895
72 0.001 0.0007143011352806332 0.0007153163364777631 0.0005537290222260827 0.0005548068743897313 0.0003530496254918224 0.0003542858554234702 0.00023144685778402562 0.00023260447744820426 0.00015788868071804074 0.00015894041305074621 0.00011458468167101622 0.00011558521750971036 9.20191492389152e-05 9.308478154551746e-05 8.786712068874325e-05 8.926001517936315e-05 0.00011483685132763588 0.00011747131722415646
73 0.001 0.0007136243377311475 0.0007146345569433116 0.0005530309085687206 0.0005541035424399441 0.00035228649684153725 0.0003535156771553805 0.0002307529751854999 0.00023190324345165713 0.00015726269010384348 0.00015830701004295562 0.00011397837465469773 0.00011497084410199294 9.134692457668887e-05 9.240214376206843e-05 8.694108196461404e-05 8.831614266750221e-05 0.00011300335424584403 0.00011558953011398195
74 0.001 0.0007129540935643617 0.0007139593299513231 0.0005523396647985742 0.0005534070835269872 0.000351531107363628 0.0003527532683936443 0.0002300661353432777 0.00023120910091256188 0.0001566429968410848 0.0001576799668132194 0.00011337824146720777 0.0001143627259393922 9.06820803490277e-05 9.172701183766888e-05 8.602718880727694e-05 8.738468264977303e-05 0.00011120223452206596 0.00011374109491336212
75 0.001 0.0007122949300063586 0.0007132906411062882 0.0005516609446370161 0.000552717476178626 0.0003507932546232374 0.00035199858609393853 0.0002293990178082647 0.00023052199734406963 0.00015604454205901748 0.00015705922565321226 0.00011280134646728481 0.00011376079584113645 9.004396195380538e-05 9.105929150577112e-05 8.514641523915274e-05 8.646544883197101e-05 0.00010944396621311202 0.0001119253667056674
76 0.001 0.0007116422850379047 0.0007126330184449588 0.0005509890404263221 0.0005520403753247726 0.00035006301886912226 0.0003512614302897459 0.00022873877079420107 0.0002298546155988536 0.00015545216193435095 0.00015645973111213718 0.00011223032450910806 0.0001131821199461313 8.941277122627028e-05 9.041832213305081e-05 8.427699754143763e-05 8.557937250804453e-05 0.00010771649233683978 0.00011015252685143603
77 0.001 0.0007109961448775265 0.000711981898998139 0.0005503239315436604 0.0005513700720769836 0.00034934035900275196 0.0003505318788510462 0.00022808534468017605 0.00022919410061472063 0.00015486580256638324 0.0001558663157908185 0.00011166511373672321 0.00011260933085632868 8.878842266662507e-05 8.978431049296584e-05 8.341876815036907e-05 8.47047300887107e-05 0.00010601922394974779 0.00010841080451458245
78 0.001 0.0007103566138672342 0.0007113372689341813 0.0005496657159311855 0.0005507065458152156 0.0003486253516297722 0.0003498098907291114 0.00022743878433373037 0.00022854040278969112 0.00015428548213839886 0.00015527892573799634 0.00011110570832676001 0.00011204236655473188 8.81708780194749e-05 8.91571706762786e-05 8.25716070442755e-05 8.384135267939557e-05 0.00010435164299643007 0.00010669960309782175
79 0.001 0.0007097236782517396 0.0007106992322019796 0.0005490143729973408 0.0005500498941226498 0.0003479179557857281 0.0003490955423571875 0.0002267990403962617 0.00022789356692450827 0.0001537111471536449 0.00015469757908825738 0.00011055204708289399 0.00011148122111140715 8.756005313455197e-05 8.85368641132709e-05 8.173535064610718e-05 8.298911908997276e-05 0.0001027131817052566 0.00010501839736063321
80 0.001 0.0007090973244087274 0.0007100677749962943 0.0005483698823458906 0.0005494000964108962 0.00034721813091834777 0.0003483887928208825 0.000226166064037726 0.00022725354367970012 0.00015314274472297157 0.00015412222229517684 0.00011000406955950422 0.0001109258331719869 8.695586501935841e-05 8.792330625417495e-05 8.090983803329783e-05 8.214786445649906e-05 0.00010110328401062253 0.00010336661223747767
81 0.001 0.0007084775388425413 0.0007094428836454011 0.0005477322237660661 0.0005487571322870243 0.0003465258368613831 0.0003476896016176379 0.00022553980691704316 0.00022662028424420426 0.00015258022251510344 0.00015355280242059424 0.00010946171600087524 0.00011037614213504096 8.635823175652435e-05 8.731641371338838e-05 8.00949107862898e-05 8.131742659415625e-05 9.952140501322636e-05 0.00010174368455214035
82 0.001 0.0007078645400735427 0.000708824544604701 0.0005471016129101978 0.0005481209815436059 0.0003458412757255009 0.0003469979286303459 0.00022492042013778988 0.00022599374029548395 0.00015202368335334558 0.00015298926708448145 0.00010892504915290583 0.00010983208809074389 8.57671759148139e-05 8.671610418600222e-05 7.929051589048381e-05 8.049764584384383e-05 9.796715152670613e-05 0.0001001490624678555
83 0.001 0.0007072583145347741 0.0007082129757140411 0.0005464780293804963 0.0005474918591435615 0.00034516440688163317 0.0003463139755716002 0.00022430785483116316 0.00022537406278014643 0.0001514730744232032 0.00015243171907300512 0.00010839400891826328 0.00010929373376222763 8.518261565996433e-05 8.612240008214866e-05 7.84964968569563e-05 7.968846833775761e-05 9.643999410136803e-05 9.858234685897841e-05
84 0.001 0.0007066588487940405 0.000707608163356494 0.000545861452976259 0.0005468697446924577 0.0003444951901125997 0.00034563770186245746 0.00022370206265319418 0.00022476120284855867 0.00015092834351042303 0.000151880105523236 0.00010786853593723236 0.00010876101889898551 8.460447028623623e-05 8.55352191851817e-05 7.771269974698105e-05 7.888973637819775e-05 9.493941424410264e-05 9.704300162684373e-05
85 0.001 0.0007060768113835355 0.0007070100940503908 0.0005452653567881146 0.0005462546179930401 0.00034385780916102886 0.0003449690673354809 0.0002231355522451839 0.0002241551121757662 0.0001504295746545273 0.0001513343741731098 0.00010739737531972382 0.00010823388399029377 8.409424224945842e-05 8.495448041312896e-05 7.702434963545377e-05 7.810129484091103e-05 9.360618912201228e-05 9.553050179700698e-05
86 0.001 0.0007055014939207988 0.0007064294568015821 0.0005446762036784223 0.0005456599791780414 0.00034322791998477503 0.0003443323098548347 0.0002225755642266546 0.00022358838010950836 0.00014993632274793293 0.00015083471987353974 0.00010693123855410087 0.00010776122599922914 8.358951092264173e-05 8.444190686735427e-05 7.634435339541097e-05 7.7408734986085e-05 9.22944227993744e-05 9.418640444056476e-05
87 0.001 0.0007049328836329239 0.0007058555225588962 0.0005440939744776738 0.0005450722639773927 0.0003426054850001757 0.0003437030311737585 0.00022202205441602206 0.0002230281662249932 0.000149448541485554 0.00015034058581471813 0.00010647007505716636 0.00010729360256509277 8.309021096715739e-05 8.39348527119689e-05 7.567259318109089e-05 7.67245852554126e-05 9.100372969350909e-05 9.28639870067709e-05
88 0.001 0.0007043664108869901 0.0007052882785030611 0.0005435140913972429 0.0005444914532267761 0.00034198598587466614 0.0003430811937591523 0.00022147141590047654 0.00022247442636251605 0.00014896349766232102 0.00014985192565331347 0.00010601178096740148 0.00010683096298015644 8.259459730216135e-05 8.343325230960875e-05 7.500736724232048e-05 7.604872690242875e-05 8.973176442333615e-05 9.156285904414627e-05
89 0.001 0.0007038020712072354 0.0007047231683832071 0.0005429365478183962 0.0005439129831785586 0.00034136940918446675 0.00034246228783126086 0.0002209236320980648 0.00022192355689618922 0.00014848117283038098 0.00014936600614401393 0.00010555633431743894 0.00010637120139586071 8.210263744821714e-05 8.293535717958106e-05 7.434860458126827e-05 7.537945268589432e-05 8.847824135377829e-05 9.028066182205625e-05
90 0.001 0.0007032398600991381 0.0007041601877072604 0.0005423613371043419 0.0005433368472132987 0.00034075574151016483 0.00034184629997988753 0.0002203786864681782 0.0002213755412469509 0.00014800154862415601 0.00014888280881520869 0.00010510371328265478 0.00010591429577334988 8.161429921011451e-05 8.244113465160048e-05 7.369623501807121e-05 7.471669094184598e-05 8.724287943554497e-05 8.901710564172274e-05
91 0.001 0.0007026797730466592 0.0007035993319644686 0.0005417884525961108 0.0005427630386936696 0.00034014496942632764 0.0003412332167993905 0.0002198365624959981 0.00022083036287728357 0.00014752460674093983 0.0001484023152778868 0.00010465389615779026 0.00010546022421726945 8.112955064604149e-05 8.195055234184008e-05 7.305018913687007e-05 7.406037083397318e-05 8.602540201539488e-05 8.777190547391773e-05
92 0.001 0.0007021196874055633 0.0007030405966226531 0.0005412157406692665 0.0005421915509602746 0.0003395348927353949 0.00034062302487816926 0.00021929545761274023 0.00022028800527546067 0.00014704895219343257 0.00014792450720603156 0.00010420578859113516 0.00010500896495215848 8.064746506639534e-05 8.146357812174912e-05 7.240953347459202e-05 7.341042229889045e-05 8.482441661675139e-05 8.65447807653603e-05
93 0.001 0.0007015596012323657 0.000702481864866424 0.0005406431992153213 0.0005416202367428493 0.0003389255082691921 0.000340013528083159 0.00021875536780717296 0.00021974666745789773 0.00014657457987728414 0.00014744798951136416 0.00010375938295149973 0.00010455942245749231 8.016802726693694e-05 8.097928325582809e-05 7.17742234562459e-05 7.276590831707151e-05 8.363970356449741e-05 8.53343290345859e-05
94 0.001 0.0007009995125587165 0.0007019231347536531 0.0005400708260946051 0.000541049093933996 0.0003383168128172846 0.00033940472324505365 0.00021821628903476192 0.0002192063454080809 0.00014610148467187763 0.00014697275707368812 0.0001033146716169485 0.00010411158905958576 7.969122211456026e-05 8.049765241221972e-05 7.114421486558773e-05 7.212678380437272e-05 8.247104609297546e-05 8.414032725111873e-05
95 0.001 0.000700426120570031 0.0007013644043173649 0.0005394817717340144 0.0005404781203952333 0.00033767827777106695 0.00033879660715245314 0.00021763678242090514 0.0002186670350763442 0.00014557802543177205 0.0001464988047567028 0.00010280805245363877 0.00010366545709431046 7.913535785684264e-05 8.001867033124847e-05 7.040274681183516e-05 7.149300404124133e-05 8.111172191387726e-05 8.296255535497e-05
96 0.001 0.0006998527383823768 0.0007007923380838431 0.0005388929110101418 0.0005398904209305891 0.0003370405259007354 0.0003381585602637609 0.00021705847496470142 0.00021808716235465733 0.00014505616500334602 0.0001459743062317574 0.00010230367256069614 0.00010315717126101123 7.858312049704058e-05 7.946027734643345e-05 6.966868896041247e-05 7.0747191644443e-05 7.977423771714316e-05 8.159291401029592e-05
97 0.0010496228983614124 0.001 0.002020602352332682 0.0007002202839606736 0.0024834354692445607 0.0005393029161815334 0.004712247621156641 0.0003375212965814363 0.00854174709233096 0.0002175084901000057 0.015197203876184536 0.0001454514108138073 0.027142477151470907 0.00010265113449578299 0.049749449744480465 7.890553328521924e-05 0.09589624880110185 7.000884795811205e-05 0.2 8.02453392500888e-05
98 0.004235602571438949 0.0010564983206625808 0.007336805952289255 0.0020323156209598047 0.008714058005603317 0.0024972245821602065 0.015024716476258112 0.004735193374982383 0.025061770718850837 0.008578320915529132 0.04079161627542227 0.015253393937469889 0.0649508755581543 0.027225142859919765 0.10074574737193842 0.049861478431656114 0.14993445055894863 0.09601482521493776 0.206 0.2
99 0.004249939542299966 0.007357791565894658 0.008737301696751656 0.01505607870396766 0.02510093603015811 0.040835074437955504 0.0649892582783015 0.10076225398432796 0.14991538310282454 0.206

View File

@@ -1,97 +1,97 @@
signal,ase,nli
0.000325019416624,3.8827360617812335e-08,2.397604591245591e-07
0.0003222815415358,3.8702821151814216e-08,2.4267833614138976e-07
0.0003195661748689,3.8578942925493807e-08,2.455296149641726e-07
0.000316873132879,3.8455721305309324e-08,2.483151861322029e-07
0.0003125687708988,3.815158818797417e-08,2.497308542349044e-07
0.0003083216327341,3.784989647314237e-08,2.5106122773764815e-07
0.0003041309702107,3.755062053762566e-08,2.523083160653813e-07
0.0002999931829076,3.725370771318225e-08,2.534716728592015e-07
0.0002959076621852,3.695913382975532e-08,2.545532047834699e-07
0.0002914749637887,3.6620413511505286e-08,2.5520557429118934e-07
0.0002871045786391,3.62847038107824e-08,2.557776344401253e-07
0.0002827879891071,3.5951828869209396e-08,2.5626453052593257e-07
0.0002785247470154,3.562176113110911e-08,2.5666832208790035e-07
0.0002743144039041,3.5294473123494e-08,2.569910409348857e-07
0.000270032675166,3.4954880805048256e-08,2.571167784361306e-07
0.0002658067200554,3.4618272391047544e-08,2.571652788509227e-07
0.000261636025157,3.428461757057609e-08,2.5713860104931033e-07
0.00025752034599,3.395388872366444e-08,2.570390408700655e-07
0.000253459157096,3.362605558722993e-08,2.5284986247287787e-07
0.000248983782073,3.3242702224575744e-08,2.48252059976888e-07
0.0002445773493265,3.286328176612301e-08,2.437277481862015e-07
0.0002402391773459,3.2487750441670215e-08,2.392761376865807e-07
0.0002359684123723,3.2116061418127753e-08,2.3489626905665574e-07
0.0002317642070805,3.174816817069829e-08,2.3058719110264335e-07
0.0002279695550926,3.1424928539548144e-08,2.2668986526609113e-07
0.0002242281358436,3.1104729317697146e-08,2.228495045304229e-07
0.0002205393783222,3.078753835343166e-08,2.190654562751529e-07
0.0002169035545525,3.047333197100547e-08,2.1533790605165431e-07
0.0002133200561122,3.01620779209974e-08,2.1166616520930645e-07
0.0002097882786443,2.9853744125792176e-08,2.080495504306458e-07
0.0002063076230434,2.9548298767727423e-08,2.0448738489666716e-07
0.0002028776374913,2.9245712991289203e-08,2.009791389793126e-07
0.0001994977236946,2.8945955168147914e-08,1.975241389908885e-07
0.0001961672877059,2.8648993828553545e-08,1.9412171682473827e-07
0.0001929967738963,2.8368195292008612e-08,1.9088102669437356e-07
0.0001898709450753,2.8090002575266257e-08,1.8768789971552863e-07
0.0001867892958482,2.7814389032455363e-08,1.8454176486632323e-07
0.000183752636707,2.754134148447891e-08,1.8115002092564538e-07
0.0001807604032471,2.7270832946920812e-08,1.7781492252546064e-07
0.0001778120365192,2.7002836607760232e-08,1.745356369687972e-07
0.0001749069829579,2.673732582084065e-08,1.7131134159682263e-07
0.0001720467771106,2.6474316260529432e-08,1.6814325920632144e-07
0.0001692307716138,2.6213779758633963e-08,1.6503047175593728e-07
0.0001664583277393,2.5955688359138642e-08,1.619720751255672e-07
0.0001635796256227,2.5677295228672648e-08,1.588223280583729e-07
0.0001607481963598,2.540169810843596e-08,1.557306487644946e-07
0.0001579633073114,2.512886316325068e-08,1.526960267832303e-07
0.0001552255108883,2.4858770138402143e-08,1.4971869736122287e-07
0.000152534027681,2.4591385101783997e-08,1.467976093017761e-07
0.0001498880910245,2.432667443532368e-08,1.439317302908228e-07
0.0001472869464661,2.4064604800471338e-08,1.411200462508912e-07
0.0001447314108795,2.3805175801260087e-08,1.3836305172259211e-07
0.0001422206714078,2.3548353146553164e-08,1.3565967973526553e-07
0.0001397539300508,2.3294102880186107e-08,1.3300888438790536e-07
0.0001372700286953,2.3032485432340423e-08,1.3035230831596558e-07
0.0001348306664569,2.2773547798807564e-08,1.277485195296911e-07
0.0001324350333325,2.2517253805739807e-08,1.2505815113074245e-07
0.0001300835425363,2.2263580536243144e-08,1.2242454150816991e-07
0.0001277753479236,2.2012491805819457e-08,1.1984647647989558e-07
0.0001255096202792,2.1763951788812352e-08,1.1732276843747534e-07
0.0001232855464269,2.1517924960982367e-08,1.148522552473446e-07
0.0001211034718808,2.1274400813402842e-08,1.1243486085670634e-07
0.0001189625537742,2.1033343271785093e-08,1.100694052812587e-07
0.0001168619671686,2.0794716623616593e-08,1.0775473577456182e-07
0.0001149842862687,2.0591381044652174e-08,1.056582342233035e-07
0.0001131392424142,2.038998454906055e-08,1.0360354473279054e-07
0.0001113262252932,2.0190503422606346e-08,1.0158979943539652e-07
0.0001095446965516,1.9992914861970927e-08,9.961620365200192e-08
0.0001077940670993,1.9797195630879305e-08,9.768192356581421e-08
0.0001060737596438,1.9603322741072024e-08,9.578614349620901e-08
0.0001043832080373,1.9411273409584944e-08,9.392806512410292e-08
0.0001027223865858,1.922103688152168e-08,9.210738192714242e-08
0.0001010907257366,1.9032590330084783e-08,9.032330177845482e-08
9.948766769187398e-05,1.8845911172333032e-08,8.857505025129074e-08
9.792267601599324e-05,1.8663442661346744e-08,8.687075031773093e-08
9.638489299064336e-05,1.848276820506329e-08,8.550652733411691e-08
9.48738026587305e-05,1.830386814585904e-08,8.416598440502352e-08
9.338895072626004e-05,1.8126723701740663e-08,8.284871850980459e-08
9.192983962632808e-05,1.7951315790883015e-08,8.155428823884958e-08
9.049598195913348e-05,1.7777625631449783e-08,8.028226120215297e-08
8.908690001727453e-05,1.7605634715742614e-08,7.903221360818749e-08
8.77022482135352e-05,1.743532764682425e-08,7.780383887402493e-08
8.634156228069215e-05,1.7266686393258476e-08,7.659672513140668e-08
8.50043874741986e-05,1.7099693224424935e-08,7.541046895998541e-08
8.381694660770028e-05,1.6962933489525264e-08,7.43570471865261e-08
8.26484651987276e-05,1.682764479561346e-08,7.33204450340972e-08
8.149860566615124e-05,1.6693821025332528e-08,7.230036302225977e-08
8.036532369463753e-05,1.6561436760581683e-08,7.129498756488483e-08
7.924836834130927e-05,1.6430487594212236e-08,7.030409604146297e-08
7.814749266035204e-05,1.6300969571299207e-08,6.932746937742372e-08
7.706245353522453e-05,1.6172879193985398e-08,6.836489189528336e-08
7.599203524832233e-05,1.6046190191322708e-08,6.741528508795074e-08
7.493604414299442e-05,1.5920900877281144e-08,6.647847715560108e-08
7.389428911314724e-05,1.57970100612018e-08,6.555429856110159e-08
7.268136514077581e-05,1.5628904744452727e-08,6.447826980203191e-08
7.148784598320314e-05,1.5462487634551132e-08,6.341945575654982e-08
0.0003277611420723,3.899470345438449e-08,2.4249796960234704e-07
0.0003250017686895,3.88695612548288e-08,2.454439759471401e-07
0.0003222650868463,3.8745084795940443e-08,2.483227752372772e-07
0.0003195509110308,3.8621269402790665e-08,2.5113526636955305e-07
0.0003152051917212,3.831511482545576e-08,2.525571834385986e-07
0.0003109173643927,3.801142847546096e-08,2.538929936309988e-07
0.0003066866698276,3.7710184357421544e-08,2.551447305997623e-07
0.0003025094755105,3.74113291159896e-08,2.5631194688927884e-07
0.0002983851632227,3.711483823464807e-08,2.57396572290435e-07
0.0002939090370085,3.677384148134545e-08,2.580457272005108e-07
0.0002894959951166,3.6435889805735655e-08,2.586138532899247e-07
0.0002851374388563,3.6100804786136576e-08,2.590960415051975e-07
0.0002808329106728,3.5768558450009235e-08,2.594943775098954e-07
0.0002765819528091,3.543912291177373e-08,2.5981091869063053e-07
0.0002722585970856,3.509728654683229e-08,2.599278683420713e-07
0.0002679917286135,3.475846792019279e-08,2.5996691909916645e-07
0.0002637808235807,3.44226362592242e-08,2.599301554005377e-07
0.000259625629125,3.4089763516669025e-08,2.598199006832183e-07
0.0002555256094681,3.375981897519707e-08,2.555756892447018e-07
0.0002510061132968,3.3373930606403456e-08,2.509166795385623e-07
0.0002465564627785,3.299202134196193e-08,2.463324441551975e-07
0.0002421759612383,3.2614046686258965e-08,2.418221717126139e-07
0.0002378637384678,3.2239959043845714e-08,2.373848791838885e-07
0.0002336189309368,3.18697111382095e-08,2.3301959212527745e-07
0.000229786907623,3.154429519674801e-08,2.290704910449234e-07
0.0002260088301865,3.1221956560459585e-08,2.251793706228873e-07
0.0002222841156937,3.090266251951521e-08,2.213455610060874e-07
0.0002186130300924,3.058638893853768e-08,2.175692384572231e-07
0.000214994952946,3.027310301755256e-08,2.138496969887665e-07
0.0002114292680468,2.9962772135295886e-08,2.1018623618806562e-07
0.0002079153646262,2.9655363939172943e-08,2.0657816240778285e-07
0.0002044527805171,2.9350849083358333e-08,2.0302493091347645e-07
0.0002010409060047,2.904919541568693e-08,1.995258515561229e-07
0.0001976791358816,2.8750370949174832e-08,1.9608024000424985e-07
0.0001944779969388,2.8467714690234763e-08,1.9279758501200657e-07
0.0001913221363037,2.8187696076865265e-08,1.895633279917293e-07
0.0001882110383135,2.7910287978744905e-08,1.8637688328585562e-07
0.0001851455117447,2.763547687941092e-08,1.8294394600063082e-07
0.000182124981625,2.7363235313116972e-08,1.795685295609545e-07
0.0001791488786026,2.7093535992876882e-08,1.762497841686646e-07
0.0001762166388716,2.6826351803791374e-08,1.729868703567211e-07
0.0001733298028653,2.6561698509687352e-08,1.6978101465406346e-07
0.0001704877122406,2.6299547455845844e-08,1.666312813274778e-07
0.0001676897174922,2.603987020688793e-08,1.635367489137303e-07
0.0001647841340631,2.575975887106765e-08,1.603495310656704e-07
0.0001619264140112,2.5482476734612484e-08,1.57221255401216e-07
0.0001591158121254,2.520798936957748e-08,1.541508918468439e-07
0.0001563528761692,2.493627607244877e-08,1.5113866658054666e-07
0.0001536368140911,2.4667302328210823e-08,1.4818350881997277e-07
0.0001509668468559,2.4401033945674264e-08,1.452843671077152e-07
0.0001483422079002,2.4137437022238145e-08,1.4244020864846993e-07
0.0001457637135497,2.3876511018332856e-08,1.3965152374161321e-07
0.0001432305385497,2.3618221073161605e-08,1.369172264569389e-07
0.0001407418727912,2.3362532671027093e-08,1.342362523931659e-07
0.0001382358967136,2.3099449050292612e-08,1.3154948565189317e-07
0.0001357749763134,2.283907541163823e-08,1.2891625322154978e-07
0.0001333582893299,2.2581374993581207e-08,1.2619656354429104e-07
0.0001309862438042,2.232632442642508e-08,1.2353438214155152e-07
0.0001286579813897,2.2073886950323847e-08,1.2092847534724114e-07
0.000126372660974,2.182402617504561e-08,1.1837763658356932e-07
0.0001241294577704,2.1576706021416435e-08,1.1588068523754277e-07
0.0001219287137845,2.1331915734067192e-08,1.1343753674855828e-07
0.0001197695745451,2.108961868593061e-08,1.110469928559736e-07
0.0001176512038143,2.08497786224886e-08,1.0870788304064741e-07
0.0001157575507964,2.064536482973696e-08,1.0658919731348233e-07
0.0001138968874049,2.0442910777630443e-08,1.0451285530046546e-07
0.0001120685950893,2.0242392369145183e-08,1.0247797592009348e-07
0.0001102721277733,2.0043786431072003e-08,1.004837520181078e-07
0.0001085068885057,1.9847069357675e-08,9.852933720632749e-08
0.0001067722923259,1.96522177979178e-08,9.661390355735894e-08
0.0001050677655983,1.9459208611917452e-08,9.473664081358061e-08
0.0001033932787473,1.9268030831168163e-08,9.289723486055733e-08
0.000101748254869,1.9078661277163014e-08,9.109488193990664e-08
0.0001001321289996,1.8891077021770737e-08,8.932879630040843e-08
9.855410305682533e-05,1.8707685556144628e-08,8.760688138727519e-08
9.70035750524988e-05,1.8526106268805162e-08,8.622858338902384e-08
9.54800221910602e-05,1.834631916025987e-08,8.487426418079828e-08
9.398298376195116e-05,1.816830511796191e-08,8.35435142269833e-08
9.251195567959074e-05,1.7992044730451886e-08,8.223588543496443e-08
9.106644418852578e-05,1.7817518892375448e-08,8.095093889480209e-08
8.964596537975902e-05,1.7644708778076547e-08,7.968824444928503e-08
8.825016836609303e-05,1.7473598709850392e-08,7.844749018716727e-08
8.687858293497841e-05,1.7304170348281186e-08,7.722825812630736e-08
8.553074854577241e-05,1.7136405660531677e-08,7.603013888213162e-08
8.433358305815234e-05,1.6998940860777966e-08,7.496595249494088e-08
8.315557511358139e-05,1.6862959916000355e-08,7.39187956635932e-08
8.199638277812437e-05,1.6728456488525712e-08,7.28883644355918e-08
8.085394966108952e-05,1.6595404781975636e-08,7.187283084061544e-08
7.972802118918304e-05,1.6463800186495995e-08,7.087196858293762e-08
7.861834686065792e-05,1.6333638547854104e-08,6.988555498611813e-08
7.752468007410017e-05,1.6204916172056103e-08,6.891337084080734e-08
7.644579608395804e-05,1.607760634807453e-08,6.795432744410053e-08
7.538149823706338e-05,1.5951707212505497e-08,6.700824998672802e-08
7.433159248509273e-05,1.5827217400105257e-08,6.607496597492307e-08
7.310944660054646e-05,1.5658417045863033e-08,6.498857397068902e-08
7.190690836035234e-05,1.5491319571073834e-08,6.391961162711614e-08
1 signal ase nli
2 0.000325019416624 0.0003277611420723 3.8827360617812335e-08 3.899470345438449e-08 2.397604591245591e-07 2.4249796960234704e-07
3 0.0003222815415358 0.0003250017686895 3.8702821151814216e-08 3.88695612548288e-08 2.4267833614138976e-07 2.454439759471401e-07
4 0.0003195661748689 0.0003222650868463 3.8578942925493807e-08 3.8745084795940443e-08 2.455296149641726e-07 2.483227752372772e-07
5 0.000316873132879 0.0003195509110308 3.8455721305309324e-08 3.8621269402790665e-08 2.483151861322029e-07 2.5113526636955305e-07
6 0.0003125687708988 0.0003152051917212 3.815158818797417e-08 3.831511482545576e-08 2.497308542349044e-07 2.525571834385986e-07
7 0.0003083216327341 0.0003109173643927 3.784989647314237e-08 3.801142847546096e-08 2.5106122773764815e-07 2.538929936309988e-07
8 0.0003041309702107 0.0003066866698276 3.755062053762566e-08 3.7710184357421544e-08 2.523083160653813e-07 2.551447305997623e-07
9 0.0002999931829076 0.0003025094755105 3.725370771318225e-08 3.74113291159896e-08 2.534716728592015e-07 2.5631194688927884e-07
10 0.0002959076621852 0.0002983851632227 3.695913382975532e-08 3.711483823464807e-08 2.545532047834699e-07 2.57396572290435e-07
11 0.0002914749637887 0.0002939090370085 3.6620413511505286e-08 3.677384148134545e-08 2.5520557429118934e-07 2.580457272005108e-07
12 0.0002871045786391 0.0002894959951166 3.62847038107824e-08 3.6435889805735655e-08 2.557776344401253e-07 2.586138532899247e-07
13 0.0002827879891071 0.0002851374388563 3.5951828869209396e-08 3.6100804786136576e-08 2.5626453052593257e-07 2.590960415051975e-07
14 0.0002785247470154 0.0002808329106728 3.562176113110911e-08 3.5768558450009235e-08 2.5666832208790035e-07 2.594943775098954e-07
15 0.0002743144039041 0.0002765819528091 3.5294473123494e-08 3.543912291177373e-08 2.569910409348857e-07 2.5981091869063053e-07
16 0.000270032675166 0.0002722585970856 3.4954880805048256e-08 3.509728654683229e-08 2.571167784361306e-07 2.599278683420713e-07
17 0.0002658067200554 0.0002679917286135 3.4618272391047544e-08 3.475846792019279e-08 2.571652788509227e-07 2.5996691909916645e-07
18 0.000261636025157 0.0002637808235807 3.428461757057609e-08 3.44226362592242e-08 2.5713860104931033e-07 2.599301554005377e-07
19 0.00025752034599 0.000259625629125 3.395388872366444e-08 3.4089763516669025e-08 2.570390408700655e-07 2.598199006832183e-07
20 0.000253459157096 0.0002555256094681 3.362605558722993e-08 3.375981897519707e-08 2.5284986247287787e-07 2.555756892447018e-07
21 0.000248983782073 0.0002510061132968 3.3242702224575744e-08 3.3373930606403456e-08 2.48252059976888e-07 2.509166795385623e-07
22 0.0002445773493265 0.0002465564627785 3.286328176612301e-08 3.299202134196193e-08 2.437277481862015e-07 2.463324441551975e-07
23 0.0002402391773459 0.0002421759612383 3.2487750441670215e-08 3.2614046686258965e-08 2.392761376865807e-07 2.418221717126139e-07
24 0.0002359684123723 0.0002378637384678 3.2116061418127753e-08 3.2239959043845714e-08 2.3489626905665574e-07 2.373848791838885e-07
25 0.0002317642070805 0.0002336189309368 3.174816817069829e-08 3.18697111382095e-08 2.3058719110264335e-07 2.3301959212527745e-07
26 0.0002279695550926 0.000229786907623 3.1424928539548144e-08 3.154429519674801e-08 2.2668986526609113e-07 2.290704910449234e-07
27 0.0002242281358436 0.0002260088301865 3.1104729317697146e-08 3.1221956560459585e-08 2.228495045304229e-07 2.251793706228873e-07
28 0.0002205393783222 0.0002222841156937 3.078753835343166e-08 3.090266251951521e-08 2.190654562751529e-07 2.213455610060874e-07
29 0.0002169035545525 0.0002186130300924 3.047333197100547e-08 3.058638893853768e-08 2.1533790605165431e-07 2.175692384572231e-07
30 0.0002133200561122 0.000214994952946 3.01620779209974e-08 3.027310301755256e-08 2.1166616520930645e-07 2.138496969887665e-07
31 0.0002097882786443 0.0002114292680468 2.9853744125792176e-08 2.9962772135295886e-08 2.080495504306458e-07 2.1018623618806562e-07
32 0.0002063076230434 0.0002079153646262 2.9548298767727423e-08 2.9655363939172943e-08 2.0448738489666716e-07 2.0657816240778285e-07
33 0.0002028776374913 0.0002044527805171 2.9245712991289203e-08 2.9350849083358333e-08 2.009791389793126e-07 2.0302493091347645e-07
34 0.0001994977236946 0.0002010409060047 2.8945955168147914e-08 2.904919541568693e-08 1.975241389908885e-07 1.995258515561229e-07
35 0.0001961672877059 0.0001976791358816 2.8648993828553545e-08 2.8750370949174832e-08 1.9412171682473827e-07 1.9608024000424985e-07
36 0.0001929967738963 0.0001944779969388 2.8368195292008612e-08 2.8467714690234763e-08 1.9088102669437356e-07 1.9279758501200657e-07
37 0.0001898709450753 0.0001913221363037 2.8090002575266257e-08 2.8187696076865265e-08 1.8768789971552863e-07 1.895633279917293e-07
38 0.0001867892958482 0.0001882110383135 2.7814389032455363e-08 2.7910287978744905e-08 1.8454176486632323e-07 1.8637688328585562e-07
39 0.000183752636707 0.0001851455117447 2.754134148447891e-08 2.763547687941092e-08 1.8115002092564538e-07 1.8294394600063082e-07
40 0.0001807604032471 0.000182124981625 2.7270832946920812e-08 2.7363235313116972e-08 1.7781492252546064e-07 1.795685295609545e-07
41 0.0001778120365192 0.0001791488786026 2.7002836607760232e-08 2.7093535992876882e-08 1.745356369687972e-07 1.762497841686646e-07
42 0.0001749069829579 0.0001762166388716 2.673732582084065e-08 2.6826351803791374e-08 1.7131134159682263e-07 1.729868703567211e-07
43 0.0001720467771106 0.0001733298028653 2.6474316260529432e-08 2.6561698509687352e-08 1.6814325920632144e-07 1.6978101465406346e-07
44 0.0001692307716138 0.0001704877122406 2.6213779758633963e-08 2.6299547455845844e-08 1.6503047175593728e-07 1.666312813274778e-07
45 0.0001664583277393 0.0001676897174922 2.5955688359138642e-08 2.603987020688793e-08 1.619720751255672e-07 1.635367489137303e-07
46 0.0001635796256227 0.0001647841340631 2.5677295228672648e-08 2.575975887106765e-08 1.588223280583729e-07 1.603495310656704e-07
47 0.0001607481963598 0.0001619264140112 2.540169810843596e-08 2.5482476734612484e-08 1.557306487644946e-07 1.57221255401216e-07
48 0.0001579633073114 0.0001591158121254 2.512886316325068e-08 2.520798936957748e-08 1.526960267832303e-07 1.541508918468439e-07
49 0.0001552255108883 0.0001563528761692 2.4858770138402143e-08 2.493627607244877e-08 1.4971869736122287e-07 1.5113866658054666e-07
50 0.000152534027681 0.0001536368140911 2.4591385101783997e-08 2.4667302328210823e-08 1.467976093017761e-07 1.4818350881997277e-07
51 0.0001498880910245 0.0001509668468559 2.432667443532368e-08 2.4401033945674264e-08 1.439317302908228e-07 1.452843671077152e-07
52 0.0001472869464661 0.0001483422079002 2.4064604800471338e-08 2.4137437022238145e-08 1.411200462508912e-07 1.4244020864846993e-07
53 0.0001447314108795 0.0001457637135497 2.3805175801260087e-08 2.3876511018332856e-08 1.3836305172259211e-07 1.3965152374161321e-07
54 0.0001422206714078 0.0001432305385497 2.3548353146553164e-08 2.3618221073161605e-08 1.3565967973526553e-07 1.369172264569389e-07
55 0.0001397539300508 0.0001407418727912 2.3294102880186107e-08 2.3362532671027093e-08 1.3300888438790536e-07 1.342362523931659e-07
56 0.0001372700286953 0.0001382358967136 2.3032485432340423e-08 2.3099449050292612e-08 1.3035230831596558e-07 1.3154948565189317e-07
57 0.0001348306664569 0.0001357749763134 2.2773547798807564e-08 2.283907541163823e-08 1.277485195296911e-07 1.2891625322154978e-07
58 0.0001324350333325 0.0001333582893299 2.2517253805739807e-08 2.2581374993581207e-08 1.2505815113074245e-07 1.2619656354429104e-07
59 0.0001300835425363 0.0001309862438042 2.2263580536243144e-08 2.232632442642508e-08 1.2242454150816991e-07 1.2353438214155152e-07
60 0.0001277753479236 0.0001286579813897 2.2012491805819457e-08 2.2073886950323847e-08 1.1984647647989558e-07 1.2092847534724114e-07
61 0.0001255096202792 0.000126372660974 2.1763951788812352e-08 2.182402617504561e-08 1.1732276843747534e-07 1.1837763658356932e-07
62 0.0001232855464269 0.0001241294577704 2.1517924960982367e-08 2.1576706021416435e-08 1.148522552473446e-07 1.1588068523754277e-07
63 0.0001211034718808 0.0001219287137845 2.1274400813402842e-08 2.1331915734067192e-08 1.1243486085670634e-07 1.1343753674855828e-07
64 0.0001189625537742 0.0001197695745451 2.1033343271785093e-08 2.108961868593061e-08 1.100694052812587e-07 1.110469928559736e-07
65 0.0001168619671686 0.0001176512038143 2.0794716623616593e-08 2.08497786224886e-08 1.0775473577456182e-07 1.0870788304064741e-07
66 0.0001149842862687 0.0001157575507964 2.0591381044652174e-08 2.064536482973696e-08 1.056582342233035e-07 1.0658919731348233e-07
67 0.0001131392424142 0.0001138968874049 2.038998454906055e-08 2.0442910777630443e-08 1.0360354473279054e-07 1.0451285530046546e-07
68 0.0001113262252932 0.0001120685950893 2.0190503422606346e-08 2.0242392369145183e-08 1.0158979943539652e-07 1.0247797592009348e-07
69 0.0001095446965516 0.0001102721277733 1.9992914861970927e-08 2.0043786431072003e-08 9.961620365200192e-08 1.004837520181078e-07
70 0.0001077940670993 0.0001085068885057 1.9797195630879305e-08 1.9847069357675e-08 9.768192356581421e-08 9.852933720632749e-08
71 0.0001060737596438 0.0001067722923259 1.9603322741072024e-08 1.96522177979178e-08 9.578614349620901e-08 9.661390355735894e-08
72 0.0001043832080373 0.0001050677655983 1.9411273409584944e-08 1.9459208611917452e-08 9.392806512410292e-08 9.473664081358061e-08
73 0.0001027223865858 0.0001033932787473 1.922103688152168e-08 1.9268030831168163e-08 9.210738192714242e-08 9.289723486055733e-08
74 0.0001010907257366 0.000101748254869 1.9032590330084783e-08 1.9078661277163014e-08 9.032330177845482e-08 9.109488193990664e-08
75 9.948766769187398e-05 0.0001001321289996 1.8845911172333032e-08 1.8891077021770737e-08 8.857505025129074e-08 8.932879630040843e-08
76 9.792267601599324e-05 9.855410305682533e-05 1.8663442661346744e-08 1.8707685556144628e-08 8.687075031773093e-08 8.760688138727519e-08
77 9.638489299064336e-05 9.70035750524988e-05 1.848276820506329e-08 1.8526106268805162e-08 8.550652733411691e-08 8.622858338902384e-08
78 9.48738026587305e-05 9.54800221910602e-05 1.830386814585904e-08 1.834631916025987e-08 8.416598440502352e-08 8.487426418079828e-08
79 9.338895072626004e-05 9.398298376195116e-05 1.8126723701740663e-08 1.816830511796191e-08 8.284871850980459e-08 8.35435142269833e-08
80 9.192983962632808e-05 9.251195567959074e-05 1.7951315790883015e-08 1.7992044730451886e-08 8.155428823884958e-08 8.223588543496443e-08
81 9.049598195913348e-05 9.106644418852578e-05 1.7777625631449783e-08 1.7817518892375448e-08 8.028226120215297e-08 8.095093889480209e-08
82 8.908690001727453e-05 8.964596537975902e-05 1.7605634715742614e-08 1.7644708778076547e-08 7.903221360818749e-08 7.968824444928503e-08
83 8.77022482135352e-05 8.825016836609303e-05 1.743532764682425e-08 1.7473598709850392e-08 7.780383887402493e-08 7.844749018716727e-08
84 8.634156228069215e-05 8.687858293497841e-05 1.7266686393258476e-08 1.7304170348281186e-08 7.659672513140668e-08 7.722825812630736e-08
85 8.50043874741986e-05 8.553074854577241e-05 1.7099693224424935e-08 1.7136405660531677e-08 7.541046895998541e-08 7.603013888213162e-08
86 8.381694660770028e-05 8.433358305815234e-05 1.6962933489525264e-08 1.6998940860777966e-08 7.43570471865261e-08 7.496595249494088e-08
87 8.26484651987276e-05 8.315557511358139e-05 1.682764479561346e-08 1.6862959916000355e-08 7.33204450340972e-08 7.39187956635932e-08
88 8.149860566615124e-05 8.199638277812437e-05 1.6693821025332528e-08 1.6728456488525712e-08 7.230036302225977e-08 7.28883644355918e-08
89 8.036532369463753e-05 8.085394966108952e-05 1.6561436760581683e-08 1.6595404781975636e-08 7.129498756488483e-08 7.187283084061544e-08
90 7.924836834130927e-05 7.972802118918304e-05 1.6430487594212236e-08 1.6463800186495995e-08 7.030409604146297e-08 7.087196858293762e-08
91 7.814749266035204e-05 7.861834686065792e-05 1.6300969571299207e-08 1.6333638547854104e-08 6.932746937742372e-08 6.988555498611813e-08
92 7.706245353522453e-05 7.752468007410017e-05 1.6172879193985398e-08 1.6204916172056103e-08 6.836489189528336e-08 6.891337084080734e-08
93 7.599203524832233e-05 7.644579608395804e-05 1.6046190191322708e-08 1.607760634807453e-08 6.741528508795074e-08 6.795432744410053e-08
94 7.493604414299442e-05 7.538149823706338e-05 1.5920900877281144e-08 1.5951707212505497e-08 6.647847715560108e-08 6.700824998672802e-08
95 7.389428911314724e-05 7.433159248509273e-05 1.57970100612018e-08 1.5827217400105257e-08 6.555429856110159e-08 6.607496597492307e-08
96 7.268136514077581e-05 7.310944660054646e-05 1.5628904744452727e-08 1.5658417045863033e-08 6.447826980203191e-08 6.498857397068902e-08
97 7.148784598320314e-05 7.190690836035234e-05 1.5462487634551132e-08 1.5491319571073834e-08 6.341945575654982e-08 6.391961162711614e-08

View File

@@ -0,0 +1,154 @@
{
"f_min": 193.0e12,
"f_max": 195.0e12,
"nf_ripple": [
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
],
"gain_ripple": [
-0.15656302345061,
-0.22244242043552,
-0.25188965661642,
-0.23575900335007,
-0.20897508375209,
-0.19440221943049,
-0.18324644053602,
-0.18053287269681,
-0.17113588777219,
-0.15460322445561,
-0.13550774706866,
-0.10606051088777,
-0.0765630234506,
-0.04962835008375,
-0.01319618927973,
0.01027114740367,
0.03378873534338,
0.04961788107202,
0.04494451423784,
0.0399193886097,
0.01584903685091,
-0.00420121440538,
-0.01847257118928,
-0.02475397822447,
-0.01053287269681,
0.01509526800668,
0.05921587102177,
0.1191656197655,
0.18147717755444,
0.23579878559464,
0.26941687604691,
0.27836159966498,
0.26956762981574,
0.23826109715241,
0.18936662479061,
0.1204721524288,
0.0453465242881,
-0.00877407872698,
-0.02199015912898,
0.00107516750419,
0.02795958961474,
0.02740682579566,
-0.01028161641541,
-0.05982935510889,
-0.06701528475711,
0.00223094639866,
0.14157768006701,
0.15017064489112
],
"dgt": [
2.714526681131686,
2.6947834587664494,
2.630396440815385,
2.602860350286428,
2.5696460593920065,
2.5364027376452056,
2.414398437185221,
2.2174389328192197,
2.16337565384239,
2.1183028432496016,
2.082225099873648,
2.0279625371819305,
1.9245345552113182,
1.8806927939516411,
1.862235672444246,
1.847275503201129,
1.8045606557581335,
1.7793941781790852,
1.737780757913635,
1.7297783508684146,
1.7057507692361864,
1.6201194134191075,
1.5986915141218316,
1.5817353179379183,
1.5353620432989845,
1.5097346239790443,
1.4670307626366115,
1.445565137158368,
1.4340878115214444,
1.418273806730323,
1.3981208704326855,
1.3779439775587023,
1.3598972673004606,
1.3439818461440451,
1.316383926863083,
1.2932153453410835,
1.2744470198196236,
1.2650555289898042,
1.2556591482982988,
1.2428104897182262,
1.1672278304018044,
1.1476135933863398,
1.1280891949729075,
1.108555289615659,
1.0895983485572227,
1.0712204022764056,
1.017807767853702,
1.0
]
}

View File

@@ -1,5 +1,124 @@
INFO gnpy.tools.cli_examples:cli_examples.py Computing path requests meshTopologyExampleV2.xls into JSON format
WARNING gnpy.tools.json_io:json_io.py
WARNING missing type_variety attribute in eqpt_config.json[Roadm]
default value is type_variety = default
INFO gnpy.tools.json_io:json_io.py Automatically converting requests from XLS to JSON
INFO gnpy.tools.worker_utils:worker_utils.py List of disjunctions:
[Disjunction 3
relaxable: false
link-diverse: True
node-diverse: True
request-id-numbers: ['3', '1']
, Disjunction 4
relaxable: false
link-diverse: True
node-diverse: True
request-id-numbers: ['4', '5']
]
INFO gnpy.tools.worker_utils:worker_utils.py Aggregating similar requests
INFO gnpy.tools.worker_utils:worker_utils.py The following services have been requested:
[PathRequest 0
source: trx Lorient_KMA
destination: trx Vannes_KBE
trx type: Voyager
trx mode: None
baud_rate: None Gbaud
bit_rate: None Gb/s
spacing: 50.0 GHz
power: 1.0 dBm
tx_power_dbm: 0.0 dBm
nb channels: 80
path_bandwidth: 100.0 Gbit/s
nodes-list: []
loose-list: []
, PathRequest 1
source: trx Brest_KLA
destination: trx Vannes_KBE
trx type: Voyager
trx mode: mode 1
baud_rate: 32.0 Gbaud
bit_rate: 100.0 Gb/s
spacing: 50.0 GHz
power: 1.0 dBm
tx_power_dbm: 0.0 dBm
nb channels: 95
path_bandwidth: 200.0 Gbit/s
nodes-list: ['roadm Brest_KLA', 'roadm Lannion_CAS', 'roadm Lorient_KMA', 'roadm Vannes_KBE']
loose-list: ['LOOSE', 'LOOSE', 'LOOSE', 'LOOSE']
, PathRequest 3
source: trx Lannion_CAS
destination: trx Rennes_STA
trx type: vendorA_trx-type1
trx mode: mode 1
baud_rate: 32.0 Gbaud
bit_rate: 100.0 Gb/s
spacing: 50.0 GHz
power: 0.0 dBm
tx_power_dbm: 0.0 dBm
nb channels: 95
path_bandwidth: 60.0 Gbit/s
nodes-list: []
loose-list: []
, PathRequest 4
source: trx Rennes_STA
destination: trx Lannion_CAS
trx type: vendorA_trx-type1
trx mode: None
baud_rate: None Gbaud
bit_rate: None Gb/s
spacing: 75.0 GHz
power: 3.0 dBm
tx_power_dbm: 0.0 dBm
nb channels: 63
path_bandwidth: 150.0 Gbit/s
nodes-list: []
loose-list: []
, PathRequest 5
source: trx Rennes_STA
destination: trx Lannion_CAS
trx type: vendorA_trx-type1
trx mode: mode 2
baud_rate: 66.0 Gbaud
bit_rate: 200.0 Gb/s
spacing: 75.0 GHz
power: 3.0 dBm
tx_power_dbm: 0.0 dBm
nb channels: 63
path_bandwidth: 20.0 Gbit/s
nodes-list: []
loose-list: []
, PathRequest 7 | 6
source: trx Lannion_CAS
destination: trx Lorient_KMA
trx type: Voyager
trx mode: mode 1
baud_rate: 32.0 Gbaud
bit_rate: 100.0 Gb/s
spacing: 50.0 GHz
power: 0.0 dBm
tx_power_dbm: 0.0 dBm
nb channels: 76
path_bandwidth: 700.0 Gbit/s
nodes-list: []
loose-list: []
, PathRequest 7b
source: trx Lannion_CAS
destination: trx Lorient_KMA
trx type: Voyager
trx mode: mode 1
baud_rate: 32.0 Gbaud
bit_rate: 100.0 Gb/s
spacing: 75.0 GHz
power: 0.0 dBm
tx_power_dbm: 0.0 dBm
nb channels: 50
path_bandwidth: 400.0 Gbit/s
nodes-list: []
loose-list: []
]
INFO gnpy.tools.worker_utils:worker_utils.py Propagating on selected path
WARNING gnpy.topology.request:request.py Redesign the network for each request channel, using the request channel as the reference channel for the design.
INFO gnpy.topology.request:request.py
request 0
Computing path from trx Lorient_KMA to trx Vannes_KBE

View File

@@ -1,4 +1,28 @@
INFO gnpy.tools.cli_examples:cli_examples.py Computing path requests CORONET_services.json into JSON format
WARNING gnpy.tools.json_io:json_io.py
WARNING missing type_variety attribute in eqpt_config.json[Roadm]
default value is type_variety = default
INFO gnpy.tools.worker_utils:worker_utils.py List of disjunctions:
[]
INFO gnpy.tools.worker_utils:worker_utils.py Aggregating similar requests
INFO gnpy.tools.worker_utils:worker_utils.py The following services have been requested:
[PathRequest 0
source: trx Abilene
destination: trx Albany
trx type: Voyager
trx mode: mode 3
baud_rate: 44.0 Gbaud
bit_rate: 300.0 Gb/s
spacing: 62.50000000000001 GHz
power: 0.0 dBm
tx_power_dbm: 0.0 dBm
nb channels: 76
path_bandwidth: 100.0 Gbit/s
nodes-list: []
loose-list: []
]
INFO gnpy.tools.worker_utils:worker_utils.py Propagating on selected path
INFO gnpy.topology.request:request.py
request 0
Computing path from trx Abilene to trx Albany

View File

@@ -0,0 +1,33 @@
INFO gnpy.tools.cli_examples:cli_examples.py Computing path requests service_pluggable.json into JSON format
WARNING gnpy.tools.json_io:json_io.py
WARNING missing type_variety attribute in eqpt_config.json[Roadm]
default value is type_variety = default
WARNING gnpy.tools.json_io:json_io.py
Equipment file extra_eqpt_config.json: duplicate equipment entry found: Transceiver-ZR400G
INFO gnpy.tools.worker_utils:worker_utils.py List of disjunctions:
[]
INFO gnpy.tools.worker_utils:worker_utils.py Aggregating similar requests
INFO gnpy.tools.worker_utils:worker_utils.py The following services have been requested:
[PathRequest 0
source: trx Brest_KLA
destination: trx Lannion_CAS
trx type: ZR400G
trx mode: SFF-ID:70
baud_rate: 60.13854679800001 Gbaud
bit_rate: 400.0 Gb/s
spacing: 100.0 GHz
power: 0.0 dBm
tx_power_dbm: 1.76 dBm
nb channels: 48
path_bandwidth: 400.0 Gbit/s
nodes-list: []
loose-list: []
]
INFO gnpy.tools.worker_utils:worker_utils.py Propagating on selected path
INFO gnpy.topology.request:request.py
request 0
Computing path from trx Brest_KLA to trx Lannion_CAS
with path constraint: ['trx Brest_KLA', 'trx Lannion_CAS']
Computed path (roadms):['roadm Brest_KLA', 'roadm Lannion_CAS']

View File

@@ -1,5 +1,9 @@
INFO gnpy.tools.cli_examples:cli_examples.py source = 'brest'
INFO gnpy.tools.cli_examples:cli_examples.py destination = 'rennes'
WARNING gnpy.tools.json_io:json_io.py
WARNING missing type_variety attribute in eqpt_config.json[Roadm]
default value is type_variety = default
INFO gnpy.tools.cli_examples:cli_examples.py source = 'trx Brest_KLA'
INFO gnpy.tools.cli_examples:cli_examples.py destination = 'trx Rennes_STA'
WARNING gnpy.core.network:network.py
WARNING: target gain and power in node west edfa in Lorient_KMA to Loudeac
is beyond all available amplifiers capabilities and/or extended_gain_range:
@@ -10,6 +14,11 @@ WARNING gnpy.core.network:network.py
is above user specified amplifier std_low_gain
max flat gain: 16dB ; required gain: 21.22dB. Please check amplifier type.
WARNING gnpy.core.network:network.py
WARNING: effective gain in Node east edfa in Stbrieuc to Rennes_STA
is below user specified amplifier std_medium_gain
min gain: 15dB ; required gain: 12.0dB. Please check amplifier type.
WARNING gnpy.core.network:network.py
WARNING: target gain and power in node west edfa in Rennes_STA to Stbrieuc
is beyond all available amplifiers capabilities and/or extended_gain_range:
@@ -305,3 +314,70 @@ WARNING gnpy.core.network:network.py
is beyond all available amplifiers capabilities and/or extended_gain_range:
a power reduction of -1.78 is applied
INFO gnpy.tools.worker_utils:worker_utils.py Power mode is set to True=> it can be modified in eqpt_config.json - Span
INFO gnpy.tools.worker_utils:worker_utils.py Now propagating between trx Brest_KLA and trx Rennes_STA
INFO gnpy.tools.worker_utils:worker_utils.py
Channels propagating: (Input optical power deviation in span = 0.00dB,
spacing = 50.00GHz,
transceiver output power = 3.00dBm,
nb_channels = 95)
INFO gnpy.tools.worker_utils:worker_utils.py
Channels propagating: (Input optical power deviation in span = 0.00dB,
spacing = 50.00GHz,
transceiver output power = 3.00dBm,
nb_channels = 95)
INFO gnpy.tools.worker_utils:worker_utils.py
Channels propagating: (Input optical power deviation in span = 0.00dB,
spacing = 50.00GHz,
transceiver output power = 3.00dBm,
nb_channels = 95)
INFO gnpy.tools.worker_utils:worker_utils.py
Channels propagating: (Input optical power deviation in span = 0.00dB,
spacing = 50.00GHz,
transceiver output power = 3.00dBm,
nb_channels = 95)
INFO gnpy.tools.worker_utils:worker_utils.py
Channels propagating: (Input optical power deviation in span = 0.00dB,
spacing = 50.00GHz,
transceiver output power = 3.00dBm,
nb_channels = 95)
INFO gnpy.tools.worker_utils:worker_utils.py
Channels propagating: (Input optical power deviation in span = 0.00dB,
spacing = 50.00GHz,
transceiver output power = 3.00dBm,
nb_channels = 95)
INFO gnpy.tools.worker_utils:worker_utils.py
Channels propagating: (Input optical power deviation in span = 0.00dB,
spacing = 50.00GHz,
transceiver output power = 3.00dBm,
nb_channels = 95)
INFO gnpy.tools.worker_utils:worker_utils.py
Channels propagating: (Input optical power deviation in span = 0.00dB,
spacing = 50.00GHz,
transceiver output power = 3.00dBm,
nb_channels = 95)
INFO gnpy.tools.worker_utils:worker_utils.py
Channels propagating: (Input optical power deviation in span = 0.00dB,
spacing = 50.00GHz,
transceiver output power = 3.00dBm,
nb_channels = 95)
INFO gnpy.tools.worker_utils:worker_utils.py
Channels propagating: (Input optical power deviation in span = 0.00dB,
spacing = 50.00GHz,
transceiver output power = 3.00dBm,
nb_channels = 95)
INFO gnpy.tools.worker_utils:worker_utils.py
Channels propagating: (Input optical power deviation in span = 0.00dB,
spacing = 50.00GHz,
transceiver output power = 3.00dBm,
nb_channels = 95)
INFO gnpy.tools.worker_utils:worker_utils.py
Channels propagating: (Input optical power deviation in span = 0.00dB,
spacing = 50.00GHz,
transceiver output power = 3.00dBm,
nb_channels = 95)
INFO gnpy.tools.worker_utils:worker_utils.py
Channels propagating: (Input optical power deviation in span = 0.00dB,
spacing = 50.00GHz,
transceiver output power = 3.00dBm,
nb_channels = 95)

View File

@@ -1,5 +1,9 @@
INFO gnpy.tools.cli_examples:cli_examples.py source = 'lannion'
INFO gnpy.tools.cli_examples:cli_examples.py destination = 'lorient'
WARNING gnpy.tools.json_io:json_io.py
WARNING missing type_variety attribute in eqpt_config.json[Roadm]
default value is type_variety = default
INFO gnpy.tools.cli_examples:cli_examples.py source = 'trx Lannion_CAS'
INFO gnpy.tools.cli_examples:cli_examples.py destination = 'trx Lorient_KMA'
WARNING gnpy.core.network:network.py
WARNING: target gain and power in node west edfa in Lorient_KMA to Loudeac
is beyond all available amplifiers capabilities and/or extended_gain_range:
@@ -10,6 +14,11 @@ WARNING gnpy.core.network:network.py
is above user specified amplifier std_low_gain
max flat gain: 16dB ; required gain: 21.18dB. Please check amplifier type.
WARNING gnpy.core.network:network.py
WARNING: effective gain in Node east edfa in Stbrieuc to Rennes_STA
is below user specified amplifier std_medium_gain
min gain: 15dB ; required gain: 12.0dB. Please check amplifier type.
WARNING gnpy.core.network:network.py
WARNING: target gain and power in node west edfa in Rennes_STA to Stbrieuc
is beyond all available amplifiers capabilities and/or extended_gain_range:
@@ -305,3 +314,10 @@ WARNING gnpy.core.network:network.py
is beyond all available amplifiers capabilities and/or extended_gain_range:
a power reduction of -1.82 is applied
INFO gnpy.tools.worker_utils:worker_utils.py Power mode is set to True=> it can be modified in eqpt_config.json - Span
INFO gnpy.tools.worker_utils:worker_utils.py Now propagating between trx Lannion_CAS and trx Lorient_KMA
INFO gnpy.tools.worker_utils:worker_utils.py
Channels propagating: (Input optical power deviation in span = 0.00dB,
spacing = 50.00GHz,
transceiver output power = 3.00dBm,
nb_channels = 96)

View File

@@ -0,0 +1,294 @@
User input for spectrum used for propagation instead of SI
Power mode is set to True
=> it can be modified in eqpt_config.json - Span
There are 3 fiber spans over 240 km between trx Site_A and trx Site_D
Now propagating between trx Site_A and trx Site_D:
Reference used for design: (Input optical power reference in span = 0.00dBm,
spacing = 50.00GHz
nb_channels = 76)
Channels propagating: (Input optical power deviation in span = cband: 0.00, lband: 0.00dB,
spacing = cband: 50.00, lband: 50.00GHz,
transceiver output power = cband: 0.00, lband: 0.00dBm,
nb_channels = 149)
Input optical power reference in span = 0.00 dBm:
Transceiver trx Site_A
GSNR (0.1nm, dB): cband: 40.00, lband: 40.00
GSNR (signal bw, dB): cband: 35.92, lband: 35.92
OSNR ASE (0.1nm, dB): cband: 40.00, lband: 40.00
OSNR ASE (signal bw, dB): cband: 35.92, lband: 35.92
CD (ps/nm): 0.00
PMD (ps): 0.00
PDL (dB): 0.00
Latency (ms): 0.00
Actual pch out (dBm): cband: 0.00, lband: 0.00
Roadm roadm Site_A
Type_variety: default
Reference loss (dB): 20.00
Actual loss (dB): cband: 20.00, lband: 20.00
Reference pch out (dBm): -20.00
Actual pch out (dBm): cband: -20.00, lband: -20.00
Multiband_amplifier east edfa in Site_A to Site_B
type_variety: std_medium_gain_multiband
type_variety: std_medium_gain_C type_variety: std_medium_gain_L
effective gain(dB): 20.90 effective gain(dB): 22.19
(before att_in and before output VOA) (before att_in and before output VOA)
tilt-target(dB) 0.00 tilt-target(dB) 0.00
noise figure (dB): 6.38 noise figure (dB): 6.19
(including att_in) (including att_in)
pad att_in (dB): 0.00 pad att_in (dB): 0.00
Power In (dBm): -1.08 Power In (dBm): -1.49
Power Out (dBm): 19.83 Power Out (dBm): 20.71
Delta_P (dB): 0.90 Delta_P (dB): 2.19
target pch (dBm): 0.90 target pch (dBm): 3.00
actual pch out (dBm): -2.09 actual pch out (dBm): -0.80
output VOA (dB): 3.00 output VOA (dB): 3.00
Fiber fiber (Site_A → Site_B)-
type_variety: SSMF
length (km): 75.00
pad att_in (dB): 0.00
total loss (dB): 15.00
(includes conn loss (dB) in: 0.00 out: 0.00)
(conn loss out includes EOL margin defined in eqpt_config.json)
reference pch out (dBm): -17.10
actual pch out (dBm): cband: -17.09, lband: -15.80
Multiband_amplifier east edfa in Site_B to Site_C
type_variety: std_medium_gain_multiband
type_variety: std_medium_gain_C type_variety: std_medium_gain_L
effective gain(dB): 18.00 effective gain(dB): 18.00
(before att_in and before output VOA) (before att_in and before output VOA)
tilt-target(dB) 0.00 tilt-target(dB) 0.00
noise figure (dB): 7.38 noise figure (dB): 7.38
(including att_in) (including att_in)
pad att_in (dB): 0.00 pad att_in (dB): 0.00
Power In (dBm): 1.83 Power In (dBm): 2.71
Power Out (dBm): 19.84 Power Out (dBm): 20.72
Delta_P (dB): 0.90 Delta_P (dB): 2.19
target pch (dBm): 0.90 target pch (dBm): 3.00
actual pch out (dBm): -2.09 actual pch out (dBm): -0.79
output VOA (dB): 3.00 output VOA (dB): 3.00
Fiber fiber (Site_B → Site_C)-
type_variety: SSMF
length (km): 80.00
pad att_in (dB): 0.00
total loss (dB): 16.80
(includes conn loss (dB) in: 0.00 out: 0.00)
(conn loss out includes EOL margin defined in eqpt_config.json)
reference pch out (dBm): -18.90
actual pch out (dBm): cband: -18.88, lband: -17.59
Multiband_amplifier east edfa in Site_C to Site_D
type_variety: std_medium_gain_multiband
type_variety: std_medium_gain_C type_variety: std_medium_gain_L
effective gain(dB): 19.80 effective gain(dB): 19.80
(before att_in and before output VOA) (before att_in and before output VOA)
tilt-target(dB) 0.00 tilt-target(dB) 0.00
noise figure (dB): 6.63 noise figure (dB): 6.63
(including att_in) (including att_in)
pad att_in (dB): 0.00 pad att_in (dB): 0.00
Power In (dBm): 0.04 Power In (dBm): 0.92
Power Out (dBm): 19.84 Power Out (dBm): 20.72
Delta_P (dB): 0.90 Delta_P (dB): 2.19
target pch (dBm): 0.90 target pch (dBm): 3.00
actual pch out (dBm): -2.08 actual pch out (dBm): -0.79
output VOA (dB): 3.00 output VOA (dB): 3.00
Fiber fiber (Site_C → Site_D)-
type_variety: SSMF
length (km): 85.00
pad att_in (dB): 0.00
total loss (dB): 18.70
(includes conn loss (dB) in: 0.00 out: 0.00)
(conn loss out includes EOL margin defined in eqpt_config.json)
reference pch out (dBm): -20.80
actual pch out (dBm): cband: -20.78, lband: -19.49
Multiband_amplifier west edfa in Site_D to Site_C
type_variety: std_medium_gain_multiband
type_variety: std_medium_gain_C type_variety: std_medium_gain_L
effective gain(dB): 21.70 effective gain(dB): 21.70
(before att_in and before output VOA) (before att_in and before output VOA)
tilt-target(dB) 0.00 tilt-target(dB) 0.00
noise figure (dB): 6.25 noise figure (dB): 6.25
(including att_in) (including att_in)
pad att_in (dB): 0.00 pad att_in (dB): 0.00
Power In (dBm): -1.85 Power In (dBm): -0.97
Power Out (dBm): 19.85 Power Out (dBm): 20.73
Delta_P (dB): 0.90 Delta_P (dB): 2.19
target pch (dBm): 0.90 target pch (dBm): 3.00
actual pch out (dBm): -2.07 actual pch out (dBm): -0.78
output VOA (dB): 3.00 output VOA (dB): 3.00
Roadm roadm Site_D
Type_variety: default
Reference loss (dB): 17.90
Actual loss (dB): cband: 17.93, lband: 19.22
Reference pch out (dBm): -20.00
Actual pch out (dBm): cband: -20.00, lband: -20.00
Transceiver trx Site_D
GSNR (0.1nm, dB): cband: 24.89, lband: 25.36
GSNR (signal bw, dB): cband: 20.80, lband: 21.28
OSNR ASE (0.1nm, dB): cband: 25.55, lband: 26.51
OSNR ASE (signal bw, dB): cband: 21.47, lband: 22.43
CD (ps/nm): 4008.00
PMD (ps): 0.62
PDL (dB): 0.00
Latency (ms): 1.18
Actual pch out (dBm): cband: 0.00, lband: 0.00
Transmission result for input optical power reference in span = 0.00 dBm:
Final GSNR (0.1 nm): 25.11 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 186.55000 -20.03 22.46 29.10 21.61
2 186.60000 -20.03 22.46 28.59 21.51
3 186.65000 -20.03 22.46 28.36 21.47
4 186.70000 -20.03 22.46 28.22 21.44
5 186.75000 -20.03 22.46 28.12 21.41
6 186.80000 -20.03 22.46 28.04 21.40
7 186.85000 -20.03 22.46 27.98 21.38
8 186.90000 -20.03 22.45 27.92 21.37
9 186.95000 -20.03 22.45 27.88 21.36
10 187.00000 -20.03 22.45 27.84 21.35
11 187.05000 -20.03 22.45 27.80 21.34
12 187.10000 -20.03 22.45 27.77 21.33
13 187.15000 -20.03 22.45 27.74 21.32
14 187.20000 -20.03 22.45 27.71 21.32
15 187.25000 -20.03 22.45 27.69 21.31
16 187.30000 -20.03 22.45 27.67 21.31
17 187.35000 -20.03 22.45 27.65 21.30
18 187.40000 -20.03 22.44 27.63 21.29
19 187.45000 -20.03 22.44 27.61 21.29
20 187.50000 -20.03 22.44 27.60 21.29
21 187.55000 -20.03 22.44 27.58 21.28
22 187.60000 -20.03 22.44 27.57 21.28
23 187.65000 -20.03 22.44 27.55 21.27
24 187.70000 -20.03 22.44 27.54 21.27
25 187.75000 -20.03 22.44 27.53 21.27
26 187.80000 -20.03 22.44 27.52 21.26
27 187.85000 -20.03 22.44 27.51 21.26
28 187.90000 -20.03 22.43 27.50 21.26
29 187.95000 -20.03 22.43 27.49 21.25
30 188.00000 -20.03 22.43 27.48 21.25
31 188.05000 -20.03 22.43 27.47 21.25
32 188.10000 -20.03 22.43 27.47 21.25
33 188.15000 -20.03 22.43 27.46 21.24
34 188.20000 -20.03 22.43 27.45 21.24
35 188.25000 -20.03 22.43 27.45 21.24
36 188.30000 -20.03 22.43 27.44 21.24
37 188.35000 -20.03 22.43 27.44 21.23
38 188.40000 -20.03 22.42 27.43 21.23
39 188.45000 -20.03 22.42 27.43 21.23
40 188.50000 -20.03 22.42 27.43 21.23
41 188.55000 -20.03 22.42 27.42 21.23
42 188.60000 -20.03 22.42 27.42 21.23
43 188.65000 -20.03 22.42 27.42 21.23
44 188.70000 -20.03 22.42 27.42 21.22
45 188.75000 -20.03 22.42 27.42 21.22
46 188.80000 -20.03 22.42 27.42 21.22
47 188.85000 -20.03 22.41 27.42 21.22
48 188.90000 -20.03 22.41 27.42 21.22
49 188.95000 -20.03 22.41 27.42 21.22
50 189.00000 -20.03 22.41 27.43 21.22
51 189.05000 -20.03 22.41 27.43 21.22
52 189.10000 -20.03 22.41 27.44 21.22
53 189.15000 -20.03 22.41 27.44 21.22
54 189.20000 -20.03 22.41 27.45 21.22
55 189.25000 -20.03 22.41 27.46 21.23
56 189.30000 -20.03 22.41 27.46 21.23
57 189.35000 -20.03 22.40 27.47 21.23
58 189.40000 -20.03 22.40 27.49 21.23
59 189.45000 -20.03 22.40 27.50 21.23
60 189.50000 -20.03 22.40 27.51 21.24
61 189.55000 -20.03 22.40 27.53 21.24
62 189.60000 -20.03 22.40 27.55 21.24
63 189.65000 -20.03 22.40 27.58 21.25
64 189.70000 -20.03 22.40 27.60 21.25
65 189.75000 -20.03 22.40 27.63 21.26
66 189.80000 -20.03 22.40 27.67 21.27
67 189.85000 -20.03 22.39 27.72 21.28
68 189.90000 -20.03 22.39 27.78 21.29
69 189.95000 -20.03 22.39 27.86 21.31
70 190.00000 -20.03 22.39 27.97 21.33
71 190.05000 -20.03 22.39 28.21 21.38
72 191.25000 -20.03 21.51 28.66 20.74
73 191.30000 -20.03 21.51 28.96 20.79
74 191.35000 -20.03 21.51 29.16 20.82
75 191.40000 -20.03 21.50 29.32 20.84
76 191.45000 -20.03 21.50 29.51 20.87
77 191.50000 -20.03 21.50 29.75 20.90
78 191.55000 -20.03 21.50 30.22 20.95
79 191.60000 -20.03 21.50 30.96 21.03
80 191.65000 -20.03 21.50 30.46 20.98
81 191.70000 -20.03 21.50 30.23 20.95
82 191.75000 -20.03 21.50 30.08 20.93
83 191.80000 -20.03 21.50 29.97 20.92
84 191.85000 -20.03 21.50 29.88 20.91
85 191.90000 -20.03 21.49 29.81 20.90
86 191.95000 -20.03 21.49 29.75 20.89
87 192.00000 -20.03 21.49 29.70 20.88
88 192.05000 -20.03 21.49 29.65 20.87
89 192.10000 -20.03 21.49 29.61 20.87
90 192.15000 -20.03 21.49 29.57 20.86
91 192.20000 -20.03 21.49 29.54 20.86
92 192.25000 -20.03 21.49 29.50 20.85
93 192.30000 -20.03 21.49 29.47 20.85
94 192.35000 -20.03 21.49 29.44 20.84
95 192.40000 -20.03 21.48 29.42 20.84
96 192.45000 -20.03 21.48 29.39 20.83
97 192.50000 -20.03 21.48 29.37 20.83
98 192.55000 -20.03 21.48 29.35 20.82
99 192.60000 -20.03 21.48 29.33 20.82
100 192.65000 -20.03 21.48 29.31 20.82
101 192.70000 -20.03 21.48 29.29 20.81
102 192.75000 -20.03 21.48 29.27 20.81
103 192.80000 -20.03 21.48 29.25 20.81
104 192.85000 -20.03 21.47 29.23 20.80
105 192.90000 -20.03 21.47 29.22 20.80
106 192.95000 -20.03 21.47 29.20 20.80
107 193.00000 -20.03 21.47 29.18 20.79
108 193.05000 -20.03 21.47 29.17 20.79
109 193.10000 -20.03 21.47 29.16 20.79
110 193.15000 -20.03 21.47 29.14 20.78
111 193.20000 -20.03 21.47 29.13 20.78
112 193.25000 -20.03 21.47 29.12 20.78
113 193.30000 -20.03 21.47 29.10 20.78
114 193.35000 -20.03 21.46 29.09 20.77
115 193.40000 -20.03 21.46 29.08 20.77
116 193.45000 -20.03 21.46 29.07 20.77
117 193.50000 -20.03 21.46 29.06 20.77
118 193.55000 -20.03 21.46 29.05 20.76
119 193.60000 -20.03 21.46 29.04 20.76
120 193.65000 -20.03 21.46 29.03 20.76
121 193.70000 -20.03 21.46 29.02 20.76
122 193.75000 -20.03 21.46 29.01 20.75
123 193.80000 -20.03 21.46 29.00 20.75
124 193.85000 -20.03 21.45 28.99 20.75
125 193.90000 -20.03 21.45 28.99 20.75
126 193.95000 -20.03 21.45 28.98 20.75
127 194.00000 -20.03 21.45 28.97 20.74
128 194.05000 -20.03 21.45 28.97 20.74
129 194.10000 -20.03 21.45 28.96 20.74
130 194.15000 -20.03 21.45 28.96 20.74
131 194.20000 -20.03 21.45 28.96 20.74
132 194.25000 -20.03 21.45 28.95 20.74
133 194.30000 -20.03 21.45 28.95 20.74
134 194.35000 -20.03 21.44 28.95 20.73
135 194.40000 -20.03 21.44 28.95 20.73
136 194.45000 -20.03 21.44 28.95 20.73
137 194.50000 -20.03 21.44 28.96 20.73
138 194.55000 -20.03 21.44 28.96 20.73
139 194.60000 -20.03 21.44 28.97 20.73
140 194.65000 -20.03 21.44 28.98 20.73
141 194.70000 -20.03 21.44 28.99 20.74
142 194.75000 -20.03 21.44 29.01 20.74
143 194.80000 -20.03 21.44 29.04 20.74
144 194.85000 -20.03 21.43 29.07 20.74
145 194.90000 -20.03 21.43 29.12 20.75
146 194.95000 -20.03 21.43 29.18 20.76
147 195.00000 -20.03 21.43 29.28 20.77
148 195.05000 -20.03 21.43 29.44 20.79
149 195.10000 -20.03 21.43 29.84 20.84
(Invalid source node 'Site_A' replaced with trx Site_A)
(Invalid destination node 'Site_D' replaced with trx Site_D)

View File

@@ -1,12 +1,18 @@
There are 96 channels propagating
Power mode is set to True
=> it can be modified in eqpt_config.json - Span
There are 6 fiber spans over 500 km between trx_Stockholm and trx_Gothenburg
Now propagating between trx_Stockholm and trx_Gothenburg:
Reference used for design: (Input optical power reference in span = 2.00dBm,
spacing = 50.00GHz
nb_channels = 96)
Propagating with input power = 2.00 dBm:
Channels propagating: (Input optical power deviation in span = 0.00dB,
spacing = 50.00GHz,
transceiver output power = 2.00dBm,
nb_channels = 96)
Input optical power reference in span = 2.00 dBm:
Transceiver trx_Stockholm
GSNR (0.1nm, dB): 35.00
GSNR (signal bw, dB): 30.98
@@ -16,14 +22,18 @@ Transceiver trx_Stockholm
PMD (ps): 0.00
PDL (dB): 0.00
Latency (ms): 0.00
Actual pch out (dBm): 2.00
Roadm roadm_Stockholm
effective loss (dB): 22.00
reference pch out (dBm): -20.00
actual pch out (dBm): -20.00
Type_variety: default
Reference loss (dB): 22.00
Actual loss (dB): 22.00
Reference pch out (dBm): -20.00
Actual pch out (dBm): -20.00
Edfa Edfa_booster_roadm_Stockholm_to_fiber (Stockholm → Norrköping)_(1/2)
type_variety: openroadm_mw_mw_booster
effective gain(dB): 22.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): -inf
(including att_in)
pad att_in (dB): 0.00
@@ -46,6 +56,7 @@ Edfa Edfa_fiber (Stockholm → Norrköping)_(1/2)
type_variety: openroadm_ila_low_noise
effective gain(dB): 16.33
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 8.01
(including att_in)
pad att_in (dB): 0.00
@@ -68,6 +79,7 @@ Edfa Edfa_preamp_roadm_Norrköping_from_fiber (Stockholm → Norrköping)_(2/2)
type_variety: openroadm_mw_mw_preamp
effective gain(dB): 16.33
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 12.59
(including att_in)
pad att_in (dB): 0.00
@@ -78,13 +90,16 @@ Edfa Edfa_preamp_roadm_Norrköping_from_fiber (Stockholm → Norrköping)_(2/2)
actual pch out (dBm): 2.03
output VOA (dB): 0.00
Roadm roadm_Norrköping
effective loss (dB): 22.00
reference pch out (dBm): -20.00
actual pch out (dBm): -20.00
Type_variety: default
Reference loss (dB): 22.00
Actual loss (dB): 22.03
Reference pch out (dBm): -20.00
Actual pch out (dBm): -20.00
Edfa Edfa_booster_roadm_Norrköping_to_fiber (Norrköping → Linköping)
type_variety: openroadm_mw_mw_booster
effective gain(dB): 22.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): -inf
(including att_in)
pad att_in (dB): 0.00
@@ -107,6 +122,7 @@ Edfa Edfa_preamp_roadm_Linköping_from_fiber (Norrköping → Linköping)
type_variety: openroadm_mw_mw_preamp
effective gain(dB): 11.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 16.00
(including att_in)
pad att_in (dB): 0.00
@@ -117,13 +133,16 @@ Edfa Edfa_preamp_roadm_Linköping_from_fiber (Norrköping → Linköping)
actual pch out (dBm): 2.01
output VOA (dB): 0.00
Roadm roadm_Linköping
effective loss (dB): 22.00
reference pch out (dBm): -20.00
actual pch out (dBm): -20.00
Type_variety: default
Reference loss (dB): 22.00
Actual loss (dB): 22.01
Reference pch out (dBm): -20.00
Actual pch out (dBm): -20.00
Edfa Edfa_booster_roadm_Linköping_to_fiber (Linköping → Jönköping)
type_variety: openroadm_mw_mw_booster
effective gain(dB): 22.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): -inf
(including att_in)
pad att_in (dB): 0.00
@@ -146,6 +165,7 @@ Edfa Edfa_preamp_roadm_Jönköping_from_fiber (Linköping → Jönköping)
type_variety: openroadm_mw_mw_preamp
effective gain(dB): 26.80
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 8.09
(including att_in)
pad att_in (dB): 0.00
@@ -156,13 +176,16 @@ Edfa Edfa_preamp_roadm_Jönköping_from_fiber (Linköping → Jönköping)
actual pch out (dBm): 2.05
output VOA (dB): 0.00
Roadm roadm_Jönköping
effective loss (dB): 22.00
reference pch out (dBm): -20.00
actual pch out (dBm): -20.00
Type_variety: default
Reference loss (dB): 22.00
Actual loss (dB): 22.05
Reference pch out (dBm): -20.00
Actual pch out (dBm): -20.00
Edfa Edfa_booster_roadm_Jönköping_to_fiber (Jönköping → Borås)
type_variety: openroadm_mw_mw_booster
effective gain(dB): 22.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): -inf
(including att_in)
pad att_in (dB): 0.00
@@ -185,6 +208,7 @@ Edfa Edfa_preamp_roadm_Borås_from_fiber (Jönköping → Borås)
type_variety: openroadm_mw_mw_preamp
effective gain(dB): 17.82
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 11.94
(including att_in)
pad att_in (dB): 0.00
@@ -195,13 +219,16 @@ Edfa Edfa_preamp_roadm_Borås_from_fiber (Jönköping → Borås)
actual pch out (dBm): 2.02
output VOA (dB): 0.00
Roadm roadm_Borås
effective loss (dB): 22.00
reference pch out (dBm): -20.00
actual pch out (dBm): -20.00
Type_variety: default
Reference loss (dB): 22.00
Actual loss (dB): 22.02
Reference pch out (dBm): -20.00
Actual pch out (dBm): -20.00
Edfa Edfa_booster_roadm_Borås_to_fiber (Borås → Gothenburg)
type_variety: openroadm_mw_mw_booster
effective gain(dB): 22.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): -inf
(including att_in)
pad att_in (dB): 0.00
@@ -224,6 +251,7 @@ Edfa Edfa_preamp_roadm_Gothenburg_from_fiber (Borås → Gothenburg)
type_variety: openroadm_mw_mw_preamp
effective gain(dB): 13.53
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 13.78
(including att_in)
pad att_in (dB): 0.00
@@ -234,9 +262,11 @@ Edfa Edfa_preamp_roadm_Gothenburg_from_fiber (Borås → Gothenburg)
actual pch out (dBm): 2.02
output VOA (dB): 0.00
Roadm roadm_Gothenburg
effective loss (dB): 22.00
reference pch out (dBm): -20.00
actual pch out (dBm): -20.00
Type_variety: default
Reference loss (dB): 22.00
Actual loss (dB): 22.02
Reference pch out (dBm): -20.00
Actual pch out (dBm): -20.00
Transceiver trx_Gothenburg
GSNR (0.1nm, dB): 18.89
GSNR (signal bw, dB): 14.86
@@ -246,8 +276,9 @@ Transceiver trx_Gothenburg
PMD (ps): 7.99
PDL (dB): 3.74
Latency (ms): 2.45
Actual pch out (dBm): 2.00
Transmission result for input power = 2.00 dBm:
Transmission result for input optical power reference in span = 2.00 dBm:
Final GSNR (0.1 nm): 18.89 dB
(No source node specified: picked trx_Stockholm)

View File

@@ -1,12 +1,18 @@
There are 96 channels propagating
Power mode is set to True
=> it can be modified in eqpt_config.json - Span
There are 6 fiber spans over 500 km between trx_Stockholm and trx_Gothenburg
Now propagating between trx_Stockholm and trx_Gothenburg:
Reference used for design: (Input optical power reference in span = 2.00dBm,
spacing = 50.00GHz
nb_channels = 96)
Propagating with input power = 2.00 dBm:
Channels propagating: (Input optical power deviation in span = 0.00dB,
spacing = 50.00GHz,
transceiver output power = 2.00dBm,
nb_channels = 96)
Input optical power reference in span = 2.00 dBm:
Transceiver trx_Stockholm
GSNR (0.1nm, dB): 35.00
GSNR (signal bw, dB): 30.98
@@ -16,14 +22,18 @@ Transceiver trx_Stockholm
PMD (ps): 0.00
PDL (dB): 0.00
Latency (ms): 0.00
Actual pch out (dBm): 2.00
Roadm roadm_Stockholm
effective loss (dB): 22.00
reference pch out (dBm): -20.00
actual pch out (dBm): -20.00
Type_variety: default
Reference loss (dB): 22.00
Actual loss (dB): 22.00
Reference pch out (dBm): -20.00
Actual pch out (dBm): -20.00
Edfa Edfa_booster_roadm_Stockholm_to_fiber (Stockholm → Norrköping)_(1/2)
type_variety: openroadm_mw_mw_booster
effective gain(dB): 22.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): -inf
(including att_in)
pad att_in (dB): 0.00
@@ -46,6 +56,7 @@ Edfa Edfa_fiber (Stockholm → Norrköping)_(1/2)
type_variety: openroadm_ila_low_noise
effective gain(dB): 16.33
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 8.01
(including att_in)
pad att_in (dB): 0.00
@@ -68,6 +79,7 @@ Edfa Edfa_preamp_roadm_Norrköping_from_fiber (Stockholm → Norrköping)_(2/2)
type_variety: openroadm_mw_mw_preamp_worstcase_ver5
effective gain(dB): 16.33
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 11.43
(including att_in)
pad att_in (dB): 0.00
@@ -78,13 +90,16 @@ Edfa Edfa_preamp_roadm_Norrköping_from_fiber (Stockholm → Norrköping)_(2/2)
actual pch out (dBm): 2.03
output VOA (dB): 0.00
Roadm roadm_Norrköping
effective loss (dB): 22.00
reference pch out (dBm): -20.00
actual pch out (dBm): -20.00
Type_variety: default
Reference loss (dB): 22.00
Actual loss (dB): 22.03
Reference pch out (dBm): -20.00
Actual pch out (dBm): -20.00
Edfa Edfa_booster_roadm_Norrköping_to_fiber (Norrköping → Linköping)
type_variety: openroadm_mw_mw_booster
effective gain(dB): 22.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): -inf
(including att_in)
pad att_in (dB): 0.00
@@ -107,6 +122,7 @@ Edfa Edfa_preamp_roadm_Linköping_from_fiber (Norrköping → Linköping)
type_variety: openroadm_mw_mw_preamp_worstcase_ver5
effective gain(dB): 11.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 16.00
(including att_in)
pad att_in (dB): 0.00
@@ -117,13 +133,16 @@ Edfa Edfa_preamp_roadm_Linköping_from_fiber (Norrköping → Linköping)
actual pch out (dBm): 2.01
output VOA (dB): 0.00
Roadm roadm_Linköping
effective loss (dB): 22.00
reference pch out (dBm): -20.00
actual pch out (dBm): -20.00
Type_variety: default
Reference loss (dB): 22.00
Actual loss (dB): 22.01
Reference pch out (dBm): -20.00
Actual pch out (dBm): -20.00
Edfa Edfa_booster_roadm_Linköping_to_fiber (Linköping → Jönköping)
type_variety: openroadm_mw_mw_booster
effective gain(dB): 22.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): -inf
(including att_in)
pad att_in (dB): 0.00
@@ -146,6 +165,7 @@ Edfa Edfa_preamp_roadm_Jönköping_from_fiber (Linköping → Jönköping)
type_variety: openroadm_mw_mw_preamp_worstcase_ver5
effective gain(dB): 26.80
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 8.01
(including att_in)
pad att_in (dB): 0.00
@@ -156,13 +176,16 @@ Edfa Edfa_preamp_roadm_Jönköping_from_fiber (Linköping → Jönköping)
actual pch out (dBm): 2.04
output VOA (dB): 0.00
Roadm roadm_Jönköping
effective loss (dB): 22.00
reference pch out (dBm): -20.00
actual pch out (dBm): -20.00
Type_variety: default
Reference loss (dB): 22.00
Actual loss (dB): 22.04
Reference pch out (dBm): -20.00
Actual pch out (dBm): -20.00
Edfa Edfa_booster_roadm_Jönköping_to_fiber (Jönköping → Borås)
type_variety: openroadm_mw_mw_booster
effective gain(dB): 22.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): -inf
(including att_in)
pad att_in (dB): 0.00
@@ -185,6 +208,7 @@ Edfa Edfa_preamp_roadm_Borås_from_fiber (Jönköping → Borås)
type_variety: openroadm_mw_mw_preamp_worstcase_ver5
effective gain(dB): 17.82
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 10.54
(including att_in)
pad att_in (dB): 0.00
@@ -195,13 +219,16 @@ Edfa Edfa_preamp_roadm_Borås_from_fiber (Jönköping → Borås)
actual pch out (dBm): 2.02
output VOA (dB): 0.00
Roadm roadm_Borås
effective loss (dB): 22.00
reference pch out (dBm): -20.00
actual pch out (dBm): -20.00
Type_variety: default
Reference loss (dB): 22.00
Actual loss (dB): 22.02
Reference pch out (dBm): -20.00
Actual pch out (dBm): -20.00
Edfa Edfa_booster_roadm_Borås_to_fiber (Borås → Gothenburg)
type_variety: openroadm_mw_mw_booster
effective gain(dB): 22.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): -inf
(including att_in)
pad att_in (dB): 0.00
@@ -224,6 +251,7 @@ Edfa Edfa_preamp_roadm_Gothenburg_from_fiber (Borås → Gothenburg)
type_variety: openroadm_mw_mw_preamp_worstcase_ver5
effective gain(dB): 13.53
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 13.54
(including att_in)
pad att_in (dB): 0.00
@@ -234,9 +262,11 @@ Edfa Edfa_preamp_roadm_Gothenburg_from_fiber (Borås → Gothenburg)
actual pch out (dBm): 2.02
output VOA (dB): 0.00
Roadm roadm_Gothenburg
effective loss (dB): 22.00
reference pch out (dBm): -20.00
actual pch out (dBm): -20.00
Type_variety: default
Reference loss (dB): 22.00
Actual loss (dB): 22.02
Reference pch out (dBm): -20.00
Actual pch out (dBm): -20.00
Transceiver trx_Gothenburg
GSNR (0.1nm, dB): 19.25
GSNR (signal bw, dB): 15.23
@@ -246,8 +276,9 @@ Transceiver trx_Gothenburg
PMD (ps): 7.99
PDL (dB): 3.74
Latency (ms): 2.45
Actual pch out (dBm): 2.00
Transmission result for input power = 2.00 dBm:
Transmission result for input optical power reference in span = 2.00 dBm:
Final GSNR (0.1 nm): 19.25 dB
(No source node specified: picked trx_Stockholm)

View File

@@ -10,7 +10,6 @@
node-diverse: True
request-id-numbers: ['4', '5']
]
Aggregating similar requests
The following services have been requested:
[PathRequest 0
source: trx Lorient_KMA
@@ -21,6 +20,7 @@
bit_rate: None Gb/s
spacing: 50.0 GHz
power: 1.0 dBm
tx_power_dbm: 0.0 dBm
nb channels: 80
path_bandwidth: 100.0 Gbit/s
nodes-list: []
@@ -34,6 +34,7 @@
bit_rate: 100.0 Gb/s
spacing: 50.0 GHz
power: 1.0 dBm
tx_power_dbm: 0.0 dBm
nb channels: 95
path_bandwidth: 200.0 Gbit/s
nodes-list: ['roadm Brest_KLA', 'roadm Lannion_CAS', 'roadm Lorient_KMA', 'roadm Vannes_KBE']
@@ -47,6 +48,7 @@
bit_rate: 100.0 Gb/s
spacing: 50.0 GHz
power: 0.0 dBm
tx_power_dbm: 0.0 dBm
nb channels: 95
path_bandwidth: 60.0 Gbit/s
nodes-list: []
@@ -60,6 +62,7 @@
bit_rate: None Gb/s
spacing: 75.0 GHz
power: 3.0 dBm
tx_power_dbm: 0.0 dBm
nb channels: 63
path_bandwidth: 150.0 Gbit/s
nodes-list: []
@@ -73,11 +76,12 @@
bit_rate: 200.0 Gb/s
spacing: 75.0 GHz
power: 3.0 dBm
tx_power_dbm: 0.0 dBm
nb channels: 63
path_bandwidth: 20.0 Gbit/s
nodes-list: []
loose-list: []
, PathRequest 7 | 6
, PathRequest 6
source: trx Lannion_CAS
destination: trx Lorient_KMA
trx type: Voyager
@@ -86,8 +90,23 @@
bit_rate: 100.0 Gb/s
spacing: 50.0 GHz
power: 0.0 dBm
tx_power_dbm: 0.0 dBm
nb channels: 76
path_bandwidth: 700.0 Gbit/s
path_bandwidth: 300.0 Gbit/s
nodes-list: []
loose-list: []
, PathRequest 7
source: trx Lannion_CAS
destination: trx Lorient_KMA
trx type: Voyager
trx mode: mode 1
baud_rate: 32.0 Gbaud
bit_rate: 100.0 Gb/s
spacing: 50.0 GHz
power: 0.0 dBm
tx_power_dbm: 0.0 dBm
nb channels: 76
path_bandwidth: 400.0 Gbit/s
nodes-list: []
loose-list: []
, PathRequest 7b
@@ -99,13 +118,12 @@
bit_rate: 100.0 Gb/s
spacing: 75.0 GHz
power: 0.0 dBm
tx_power_dbm: 0.0 dBm
nb channels: 50
path_bandwidth: 400.0 Gbit/s
nodes-list: []
loose-list: []
]
Computing all paths with constraints
Propagating on selected path
Result summary
req id demand GSNR@bandwidth A-Z (Z-A) GSNR@0.1nm A-Z (Z-A) Receiver minOSNR mode Gbit/s nb of tsp pairs N,M or blocking reason
0 trx Lorient_KMA to trx Vannes_KBE : 24.83 28.92 14 mode 1 100.0 1 ([-284],[4])

View File

@@ -1,6 +1,5 @@
List of disjunctions
[]
Aggregating similar requests
The following services have been requested:
[PathRequest 0
source: trx Abilene
@@ -11,13 +10,12 @@
bit_rate: 300.0 Gb/s
spacing: 62.50000000000001 GHz
power: 0.0 dBm
tx_power_dbm: 0.0 dBm
nb channels: 76
path_bandwidth: 100.0 Gbit/s
nodes-list: []
loose-list: []
]
Computing all paths with constraints
Propagating on selected path
Result summary
req id demand GSNR@bandwidth A-Z (Z-A) GSNR@0.1nm A-Z (Z-A) Receiver minOSNR mode Gbit/s nb of tsp pairs N,M or blocking reason
0 trx Abilene to trx Albany : 9.04 14.5 - mode 3 100.0 - MODE_NOT_FEASIBLE

View File

@@ -0,0 +1,22 @@
List of disjunctions
[]
The following services have been requested:
[PathRequest 0
source: trx Brest_KLA
destination: trx Lannion_CAS
trx type: ZR400G
trx mode: SFF-ID:70
baud_rate: 60.13854679800001 Gbaud
bit_rate: 400.0 Gb/s
spacing: 100.0 GHz
power: 0.0 dBm
tx_power_dbm: 1.76 dBm
nb channels: 48
path_bandwidth: 400.0 Gbit/s
nodes-list: []
loose-list: []
]
Result summary
req id demand GSNR@bandwidth A-Z (Z-A) GSNR@0.1nm A-Z (Z-A) Receiver minOSNR mode Gbit/s nb of tsp pairs N,M or blocking reason
0 trx Brest_KLA to trx Lannion_CAS : 21.3 28.12 26 SFF-ID:70 400.0 1 ([-280],[8])
Result summary shows mean GSNR and OSNR (average over all channels)

View File

@@ -1,12 +1,18 @@
There are 95 channels propagating
Power mode is set to True
=> it can be modified in eqpt_config.json - Span
There are 4 fiber spans over 200 km between trx Brest_KLA and trx Rennes_STA
Now propagating between trx Brest_KLA and trx Rennes_STA:
Reference used for design: (Input optical power reference in span = 3.00dBm,
spacing = 50.00GHz
nb_channels = 95)
Propagating with input power = -3.00 dBm:
Channels propagating: (Input optical power deviation in span = 0.00dB,
spacing = 50.00GHz,
transceiver output power = 3.00dBm,
nb_channels = 95)
Input optical power reference in span = -3.00 dBm:
Transceiver trx Rennes_STA
GSNR (0.1nm, dB): 23.73
GSNR (signal bw, dB): 19.65
@@ -16,8 +22,8 @@ Transceiver trx Rennes_STA
PMD (ps): 0.57
PDL (dB): 0.00
Latency (ms): 0.98
Propagating with input power = -2.50 dBm:
Actual pch out (dBm): 3.00
Input optical power reference in span = -2.50 dBm:
Transceiver trx Rennes_STA
GSNR (0.1nm, dB): 24.01
GSNR (signal bw, dB): 19.93
@@ -27,8 +33,8 @@ Transceiver trx Rennes_STA
PMD (ps): 0.57
PDL (dB): 0.00
Latency (ms): 0.98
Propagating with input power = -2.00 dBm:
Actual pch out (dBm): 3.00
Input optical power reference in span = -2.00 dBm:
Transceiver trx Rennes_STA
GSNR (0.1nm, dB): 24.25
GSNR (signal bw, dB): 20.17
@@ -38,8 +44,8 @@ Transceiver trx Rennes_STA
PMD (ps): 0.57
PDL (dB): 0.00
Latency (ms): 0.98
Propagating with input power = -1.50 dBm:
Actual pch out (dBm): 3.00
Input optical power reference in span = -1.50 dBm:
Transceiver trx Rennes_STA
GSNR (0.1nm, dB): 24.44
GSNR (signal bw, dB): 20.36
@@ -49,8 +55,8 @@ Transceiver trx Rennes_STA
PMD (ps): 0.57
PDL (dB): 0.00
Latency (ms): 0.98
Propagating with input power = -1.00 dBm:
Actual pch out (dBm): 3.00
Input optical power reference in span = -1.00 dBm:
Transceiver trx Rennes_STA
GSNR (0.1nm, dB): 24.57
GSNR (signal bw, dB): 20.49
@@ -60,8 +66,8 @@ Transceiver trx Rennes_STA
PMD (ps): 0.57
PDL (dB): 0.00
Latency (ms): 0.98
Propagating with input power = -0.50 dBm:
Actual pch out (dBm): 3.00
Input optical power reference in span = -0.50 dBm:
Transceiver trx Rennes_STA
GSNR (0.1nm, dB): 24.63
GSNR (signal bw, dB): 20.55
@@ -71,8 +77,8 @@ Transceiver trx Rennes_STA
PMD (ps): 0.57
PDL (dB): 0.00
Latency (ms): 0.98
Propagating with input power = -0.00 dBm:
Actual pch out (dBm): 3.00
Input optical power reference in span = -0.00 dBm:
Transceiver trx Rennes_STA
GSNR (0.1nm, dB): 24.60
GSNR (signal bw, dB): 20.52
@@ -82,8 +88,8 @@ Transceiver trx Rennes_STA
PMD (ps): 0.57
PDL (dB): 0.00
Latency (ms): 0.98
Propagating with input power = 0.50 dBm:
Actual pch out (dBm): 3.00
Input optical power reference in span = 0.50 dBm:
Transceiver trx Rennes_STA
GSNR (0.1nm, dB): 24.42
GSNR (signal bw, dB): 20.34
@@ -93,8 +99,8 @@ Transceiver trx Rennes_STA
PMD (ps): 0.57
PDL (dB): 0.00
Latency (ms): 0.98
Propagating with input power = 1.00 dBm:
Actual pch out (dBm): 3.00
Input optical power reference in span = 1.00 dBm:
Transceiver trx Rennes_STA
GSNR (0.1nm, dB): 24.16
GSNR (signal bw, dB): 20.08
@@ -104,8 +110,8 @@ Transceiver trx Rennes_STA
PMD (ps): 0.57
PDL (dB): 0.00
Latency (ms): 0.98
Propagating with input power = 1.50 dBm:
Actual pch out (dBm): 3.00
Input optical power reference in span = 1.50 dBm:
Transceiver trx Rennes_STA
GSNR (0.1nm, dB): 24.02
GSNR (signal bw, dB): 19.93
@@ -115,8 +121,8 @@ Transceiver trx Rennes_STA
PMD (ps): 0.57
PDL (dB): 0.00
Latency (ms): 0.98
Propagating with input power = 2.00 dBm:
Actual pch out (dBm): 3.00
Input optical power reference in span = 2.00 dBm:
Transceiver trx Rennes_STA
GSNR (0.1nm, dB): 24.02
GSNR (signal bw, dB): 19.93
@@ -126,8 +132,8 @@ Transceiver trx Rennes_STA
PMD (ps): 0.57
PDL (dB): 0.00
Latency (ms): 0.98
Propagating with input power = 2.50 dBm:
Actual pch out (dBm): 3.00
Input optical power reference in span = 2.50 dBm:
Transceiver trx Rennes_STA
GSNR (0.1nm, dB): 24.02
GSNR (signal bw, dB): 19.93
@@ -137,8 +143,8 @@ Transceiver trx Rennes_STA
PMD (ps): 0.57
PDL (dB): 0.00
Latency (ms): 0.98
Propagating with input power = 3.00 dBm:
Actual pch out (dBm): 3.00
Input optical power reference in span = 3.00 dBm:
Transceiver trx Rennes_STA
GSNR (0.1nm, dB): 24.02
GSNR (signal bw, dB): 19.93
@@ -148,6 +154,7 @@ Transceiver trx Rennes_STA
PMD (ps): 0.57
PDL (dB): 0.00
Latency (ms): 0.98
Actual pch out (dBm): 3.00
(Invalid source node 'brest' replaced with trx Brest_KLA)

View File

@@ -1,13 +1,19 @@
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:
Reference used for design: (Input optical power reference in span = 0.00dBm,
spacing = 50.00GHz
nb_channels = 76)
Propagating with input power = 0.00 dBm:
Channels propagating: (Input optical power deviation in span = 0.00dB,
spacing = 50.00GHz,
transceiver output power = 0.00dBm,
nb_channels = 76)
Input optical power reference in span = 0.00 dBm:
Transceiver trx Lannion_CAS
GSNR (0.1nm, dB): 40.00
GSNR (signal bw, dB): 35.92
@@ -17,14 +23,18 @@ Transceiver trx Lannion_CAS
PMD (ps): 0.00
PDL (dB): 0.00
Latency (ms): 0.00
Actual pch out (dBm): 0.00
Roadm roadm Lannion_CAS
effective loss (dB): 20.00
reference pch out (dBm): -20.00
actual pch out (dBm): -20.00
Type_variety: default
Reference loss (dB): 20.00
Actual loss (dB): 20.00
Reference pch out (dBm): -20.00
Actual pch out (dBm): -20.00
Edfa east edfa in Lannion_CAS to Corlay
type_variety: std_medium_gain
effective gain(dB): 21.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 6.36
(including att_in)
pad att_in (dB): 0.00
@@ -69,6 +79,7 @@ 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)
tilt-target(dB) 0.00
noise figure (dB): 5.92
(including att_in)
pad att_in (dB): 0.00
@@ -79,9 +90,11 @@ Edfa west edfa in Lorient_KMA to Loudeac
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
Type_variety: default
Reference loss (dB): 21.00
Actual loss (dB): 21.05
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.53
@@ -91,8 +104,9 @@ Transceiver trx Lorient_KMA
PMD (ps): 0.46
PDL (dB): 0.00
Latency (ms): 0.64
Actual pch out (dBm): 0.00
Transmission result for input power = 0.00 dBm:
Transmission result for input optical power reference in span = 0.00 dBm:
Final GSNR (0.1 nm): 23.61 dB
(No source node specified: picked trx Lannion_CAS)

View File

@@ -1,13 +1,19 @@
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:
Reference used for design: (Input optical power reference in span = 0.00dBm,
spacing = 50.00GHz
nb_channels = 76)
Propagating with input power = 0.00 dBm:
Channels propagating: (Input optical power deviation in span = mode_1: 0.00, mode_2: 0.00dB,
spacing = mode_1: 50.00, mode_2: 75.00GHz,
transceiver output power = mode_1: 0.00, mode_2: 0.00dBm,
nb_channels = 60)
Input optical power reference in span = 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
@@ -17,14 +23,18 @@ Transceiver trx Lannion_CAS
PMD (ps): 0.00
PDL (dB): 0.00
Latency (ms): 0.00
Actual pch out (dBm): mode_1: 0.00, mode_2: 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
Type_variety: default
Reference loss (dB): 20.00
Actual loss (dB): mode_1: 20.00, mode_2: 20.00
Reference pch out (dBm): -20.00
Actual pch out (dBm): mode_1: -20.00, mode_2: -20.00
Edfa east edfa in Lannion_CAS to Corlay
type_variety: std_medium_gain
effective gain(dB): 21.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 6.36
(including att_in)
pad att_in (dB): 0.00
@@ -69,6 +79,7 @@ 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)
tilt-target(dB) 0.00
noise figure (dB): 5.92
(including att_in)
pad att_in (dB): 0.00
@@ -79,9 +90,11 @@ Edfa west edfa in Lorient_KMA to Loudeac
actual pch out (dBm): mode_1: 1.04, mode_2: 1.09
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
Type_variety: default
Reference loss (dB): 21.00
Actual loss (dB): mode_1: 21.04, mode_2: 21.09
Reference pch out (dBm): -20.00
Actual pch out (dBm): mode_1: -20.00, mode_2: -20.00
Transceiver trx Lorient_KMA
GSNR (0.1nm, dB): mode_1: 23.66, mode_2: 23.81
GSNR (signal bw, dB): mode_1: 19.58, mode_2: 16.72
@@ -91,8 +104,9 @@ Transceiver trx Lorient_KMA
PMD (ps): 0.46
PDL (dB): 0.00
Latency (ms): 0.64
Actual pch out (dBm): mode_1: 0.00, mode_2: 0.00
Transmission result for input power = 0.00 dBm:
Transmission result for input optical power reference in span = 0.00 dBm:
Final GSNR (0.1 nm): 23.72 dB
The GSNR per channel at the end of the line is:

View File

@@ -1,13 +1,19 @@
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 15 fiber spans over 1200 km between Site_A and Site_B
Now propagating between Site_A and Site_B:
Reference used for design: (Input optical power reference in span = 0.00dBm,
spacing = 50.00GHz
nb_channels = 96)
Propagating with input power = 0.00 dBm:
Channels propagating: (Input optical power deviation in span = mode_1: 0.00, mode_2: 0.00dB,
spacing = mode_1: 50.00, mode_2: 75.00GHz,
transceiver output power = mode_1: 0.00, mode_2: 0.00dBm,
nb_channels = 60)
Input optical power reference in span = 0.00 dBm:
Transceiver Site_A
GSNR (0.1nm, dB): mode_1: 40.00, mode_2: 40.00
GSNR (signal bw, dB): mode_1: 35.92, mode_2: 32.91
@@ -17,14 +23,18 @@ Transceiver Site_A
PMD (ps): 0.00
PDL (dB): 0.00
Latency (ms): 0.00
Actual pch out (dBm): mode_1: 0.00, mode_2: 0.00
Roadm roadm Site A
effective loss (dB): 20.00
reference pch out (dBm): -20.00
actual pch out (dBm): mode_1: -20.00, mode_2: -20.00
Type_variety: default
Reference loss (dB): 20.00
Actual loss (dB): mode_1: 20.00, mode_2: 20.00
Reference pch out (dBm): -20.00
Actual pch out (dBm): mode_1: -20.00, mode_2: -20.00
Edfa booster A
type_variety: std_medium_gain
effective gain(dB): 20.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 6.58
(including att_in)
pad att_in (dB): 0.00
@@ -47,6 +57,7 @@ Edfa Edfa1
type_variety: test
effective gain(dB): 16.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 8.86
(including att_in)
pad att_in (dB): 0.00
@@ -69,6 +80,7 @@ Edfa Edfa2
type_variety: test_fixed_gain
effective gain(dB): 16.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 9.00
(including att_in)
pad att_in (dB): 4.00
@@ -91,6 +103,7 @@ Edfa Edfa3
type_variety: test
effective gain(dB): 16.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 8.86
(including att_in)
pad att_in (dB): 0.00
@@ -113,6 +126,7 @@ Edfa Edfa4
type_variety: test_fixed_gain
effective gain(dB): 16.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 9.00
(including att_in)
pad att_in (dB): 4.00
@@ -135,6 +149,7 @@ Edfa Edfa5
type_variety: test
effective gain(dB): 16.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 8.86
(including att_in)
pad att_in (dB): 0.00
@@ -145,13 +160,16 @@ Edfa Edfa5
actual pch out (dBm): mode_1: 0.05, mode_2: 0.08
output VOA (dB): 0.00
Roadm roadm Site C
effective loss (dB): 20.00
reference pch out (dBm): -20.00
actual pch out (dBm): mode_1: -20.00, mode_2: -20.00
Type_variety: default
Reference loss (dB): 20.00
Actual loss (dB): mode_1: 20.05, mode_2: 20.08
Reference pch out (dBm): -20.00
Actual pch out (dBm): mode_1: -20.00, mode_2: -20.00
Edfa booster C
type_variety: std_medium_gain
effective gain(dB): 20.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 6.58
(including att_in)
pad att_in (dB): 0.00
@@ -174,6 +192,7 @@ Edfa Edfa6
type_variety: test_fixed_gain
effective gain(dB): 16.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 9.00
(including att_in)
pad att_in (dB): 4.00
@@ -196,6 +215,7 @@ Edfa Edfa7
type_variety: test
effective gain(dB): 16.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 8.86
(including att_in)
pad att_in (dB): 0.00
@@ -218,6 +238,7 @@ Edfa Edfa8
type_variety: test_fixed_gain
effective gain(dB): 16.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 9.00
(including att_in)
pad att_in (dB): 4.00
@@ -240,6 +261,7 @@ Edfa Edfa9
type_variety: test
effective gain(dB): 16.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 8.86
(including att_in)
pad att_in (dB): 0.00
@@ -262,6 +284,7 @@ Edfa Edfa10
type_variety: test_fixed_gain
effective gain(dB): 16.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 9.00
(including att_in)
pad att_in (dB): 4.00
@@ -272,13 +295,16 @@ Edfa Edfa10
actual pch out (dBm): mode_1: 0.05, mode_2: 0.08
output VOA (dB): 0.00
Roadm roadm Site D
effective loss (dB): 20.00
reference pch out (dBm): -20.00
actual pch out (dBm): mode_1: -20.00, mode_2: -20.00
Type_variety: default
Reference loss (dB): 20.00
Actual loss (dB): mode_1: 20.05, mode_2: 20.08
Reference pch out (dBm): -20.00
Actual pch out (dBm): mode_1: -20.00, mode_2: -20.00
Edfa booster D
type_variety: std_medium_gain
effective gain(dB): 20.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 6.58
(including att_in)
pad att_in (dB): 0.00
@@ -301,6 +327,7 @@ Edfa Edfa11
type_variety: test
effective gain(dB): 16.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 8.86
(including att_in)
pad att_in (dB): 0.00
@@ -323,6 +350,7 @@ Edfa Edfa12
type_variety: test_fixed_gain
effective gain(dB): 16.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 9.00
(including att_in)
pad att_in (dB): 4.00
@@ -333,13 +361,16 @@ Edfa Edfa12
actual pch out (dBm): mode_1: 0.03, mode_2: 0.04
output VOA (dB): 0.00
Roadm roadm Site E
effective loss (dB): 20.00
reference pch out (dBm): -20.00
actual pch out (dBm): mode_1: -20.00, mode_2: -20.00
Type_variety: default
Reference loss (dB): 20.00
Actual loss (dB): mode_1: 20.03, mode_2: 20.04
Reference pch out (dBm): -20.00
Actual pch out (dBm): mode_1: -20.00, mode_2: -20.00
Edfa booster E
type_variety: std_medium_gain
effective gain(dB): 20.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 6.58
(including att_in)
pad att_in (dB): 0.00
@@ -362,6 +393,7 @@ Edfa Edfa13
type_variety: test
effective gain(dB): 16.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 8.86
(including att_in)
pad att_in (dB): 0.00
@@ -384,6 +416,7 @@ Edfa Edfa14
type_variety: test_fixed_gain
effective gain(dB): 16.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 9.00
(including att_in)
pad att_in (dB): 4.00
@@ -406,6 +439,7 @@ Edfa Edfa15
type_variety: test
effective gain(dB): 16.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 8.86
(including att_in)
pad att_in (dB): 0.00
@@ -416,9 +450,11 @@ Edfa Edfa15
actual pch out (dBm): mode_1: 0.03, mode_2: 0.05
output VOA (dB): 0.00
Roadm roadm Site B
effective loss (dB): 20.00
reference pch out (dBm): -20.00
actual pch out (dBm): mode_1: -20.00, mode_2: -20.00
Type_variety: default
Reference loss (dB): 20.00
Actual loss (dB): mode_1: 20.03, mode_2: 20.05
Reference pch out (dBm): -20.00
Actual pch out (dBm): mode_1: -20.00, mode_2: -20.00
Transceiver Site_B
GSNR (0.1nm, dB): mode_1: 18.11, mode_2: 19.18
GSNR (signal bw, dB): mode_1: 14.02, mode_2: 12.09
@@ -428,8 +464,9 @@ Transceiver Site_B
PMD (ps): 1.39
PDL (dB): 0.00
Latency (ms): 5.88
Actual pch out (dBm): mode_1: 0.00, mode_2: 0.00
Transmission result for input power = 0.00 dBm:
Transmission result for input optical power reference in span = 0.00 dBm:
Final GSNR (0.1 nm): 18.56 dB
(No source node specified: picked Site_A)

View File

@@ -1,13 +1,19 @@
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 15 fiber spans over 1200 km between Site_A and Site_B
Now propagating between Site_A and Site_B:
Reference used for design: (Input optical power reference in span = 0.00dBm,
spacing = 50.00GHz
nb_channels = 95)
Propagating with input power = 0.00 dBm:
Channels propagating: (Input optical power deviation in span = mode_1: 0.00, mode_2: 0.00dB,
spacing = mode_1: 50.00, mode_2: 75.00GHz,
transceiver output power = mode_1: 0.00, mode_2: 0.00dBm,
nb_channels = 60)
Input optical power reference in span = 0.00 dBm:
Transceiver Site_A
GSNR (0.1nm, dB): mode_1: 40.00, mode_2: 40.00
GSNR (signal bw, dB): mode_1: 35.92, mode_2: 32.91
@@ -17,14 +23,18 @@ Transceiver Site_A
PMD (ps): 0.00
PDL (dB): 0.00
Latency (ms): 0.00
Actual pch out (dBm): mode_1: 0.00, mode_2: 0.00
Roadm roadm Site A
effective loss (dB): 20.00
reference pch out (dBm): -20.00
actual pch out (dBm): mode_1: -20.00, mode_2: -16.99
Type_variety: default
Reference loss (dB): 20.00
Actual loss (dB): mode_1: 20.00, mode_2: 16.99
Reference pch out (dBm): -20.00
Actual pch out (dBm): mode_1: -20.00, mode_2: -16.99
Edfa booster A
type_variety: std_medium_gain
effective gain(dB): 20.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 6.58
(including att_in)
pad att_in (dB): 0.00
@@ -47,6 +57,7 @@ Edfa Edfa1
type_variety: test
effective gain(dB): 16.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 8.86
(including att_in)
pad att_in (dB): 0.00
@@ -69,6 +80,7 @@ Edfa Edfa2
type_variety: test_fixed_gain
effective gain(dB): 16.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 9.00
(including att_in)
pad att_in (dB): 4.00
@@ -91,6 +103,7 @@ Edfa Edfa3
type_variety: test
effective gain(dB): 16.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 8.86
(including att_in)
pad att_in (dB): 0.00
@@ -113,6 +126,7 @@ Edfa Edfa4
type_variety: test_fixed_gain
effective gain(dB): 16.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 9.00
(including att_in)
pad att_in (dB): 4.00
@@ -135,6 +149,7 @@ Edfa Edfa5
type_variety: test
effective gain(dB): 16.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 8.86
(including att_in)
pad att_in (dB): 0.00
@@ -145,13 +160,16 @@ Edfa Edfa5
actual pch out (dBm): mode_1: 0.06, mode_2: 3.07
output VOA (dB): 0.00
Roadm roadm Site C
effective loss (dB): 20.00
reference pch out (dBm): -20.00
actual pch out (dBm): mode_1: -20.00, mode_2: -16.99
Type_variety: default
Reference loss (dB): 20.00
Actual loss (dB): mode_1: 20.06, mode_2: 20.06
Reference pch out (dBm): -20.00
Actual pch out (dBm): mode_1: -20.00, mode_2: -16.99
Edfa booster C
type_variety: std_medium_gain
effective gain(dB): 20.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 6.58
(including att_in)
pad att_in (dB): 0.00
@@ -174,6 +192,7 @@ Edfa Edfa6
type_variety: test_fixed_gain
effective gain(dB): 16.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 9.00
(including att_in)
pad att_in (dB): 4.00
@@ -196,6 +215,7 @@ Edfa Edfa7
type_variety: test
effective gain(dB): 16.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 8.86
(including att_in)
pad att_in (dB): 0.00
@@ -218,6 +238,7 @@ Edfa Edfa8
type_variety: test_fixed_gain
effective gain(dB): 16.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 9.00
(including att_in)
pad att_in (dB): 4.00
@@ -240,6 +261,7 @@ Edfa Edfa9
type_variety: test
effective gain(dB): 16.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 8.86
(including att_in)
pad att_in (dB): 0.00
@@ -262,6 +284,7 @@ Edfa Edfa10
type_variety: test_fixed_gain
effective gain(dB): 16.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 9.00
(including att_in)
pad att_in (dB): 4.00
@@ -272,13 +295,16 @@ Edfa Edfa10
actual pch out (dBm): mode_1: 0.06, mode_2: 3.07
output VOA (dB): 0.00
Roadm roadm Site D
effective loss (dB): 20.00
reference pch out (dBm): -20.00
actual pch out (dBm): mode_1: -20.00, mode_2: -16.99
Type_variety: default
Reference loss (dB): 20.00
Actual loss (dB): mode_1: 20.06, mode_2: 20.06
Reference pch out (dBm): -20.00
Actual pch out (dBm): mode_1: -20.00, mode_2: -16.99
Edfa booster D
type_variety: std_medium_gain
effective gain(dB): 20.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 6.58
(including att_in)
pad att_in (dB): 0.00
@@ -301,6 +327,7 @@ Edfa Edfa11
type_variety: test
effective gain(dB): 16.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 8.86
(including att_in)
pad att_in (dB): 0.00
@@ -323,6 +350,7 @@ Edfa Edfa12
type_variety: test_fixed_gain
effective gain(dB): 16.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 9.00
(including att_in)
pad att_in (dB): 4.00
@@ -333,13 +361,16 @@ Edfa Edfa12
actual pch out (dBm): mode_1: 0.03, mode_2: 3.04
output VOA (dB): 0.00
Roadm roadm Site E
effective loss (dB): 20.00
reference pch out (dBm): -20.00
actual pch out (dBm): mode_1: -20.00, mode_2: -16.99
Type_variety: default
Reference loss (dB): 20.00
Actual loss (dB): mode_1: 20.03, mode_2: 20.03
Reference pch out (dBm): -20.00
Actual pch out (dBm): mode_1: -20.00, mode_2: -16.99
Edfa booster E
type_variety: std_medium_gain
effective gain(dB): 20.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 6.58
(including att_in)
pad att_in (dB): 0.00
@@ -362,6 +393,7 @@ Edfa Edfa13
type_variety: test
effective gain(dB): 16.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 8.86
(including att_in)
pad att_in (dB): 0.00
@@ -384,6 +416,7 @@ Edfa Edfa14
type_variety: test_fixed_gain
effective gain(dB): 16.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 9.00
(including att_in)
pad att_in (dB): 4.00
@@ -406,6 +439,7 @@ Edfa Edfa15
type_variety: test
effective gain(dB): 16.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 8.86
(including att_in)
pad att_in (dB): 0.00
@@ -416,9 +450,11 @@ Edfa Edfa15
actual pch out (dBm): mode_1: 0.04, mode_2: 3.05
output VOA (dB): 0.00
Roadm roadm Site B
effective loss (dB): 20.00
reference pch out (dBm): -20.00
actual pch out (dBm): mode_1: -20.00, mode_2: -16.99
Type_variety: default
Reference loss (dB): 20.00
Actual loss (dB): mode_1: 20.04, mode_2: 20.04
Reference pch out (dBm): -20.00
Actual pch out (dBm): mode_1: -20.00, mode_2: -16.99
Transceiver Site_B
GSNR (0.1nm, dB): mode_1: 17.91, mode_2: 20.37
GSNR (signal bw, dB): mode_1: 13.83, mode_2: 13.28
@@ -428,8 +464,9 @@ Transceiver Site_B
PMD (ps): 1.39
PDL (dB): 0.00
Latency (ms): 5.88
Actual pch out (dBm): mode_1: 0.00, mode_2: 0.00
Transmission result for input power = 0.00 dBm:
Transmission result for input optical power reference in span = 0.00 dBm:
Final GSNR (0.1 nm): 18.94 dB
(No source node specified: picked Site_A)

View File

@@ -1,13 +1,19 @@
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 15 fiber spans over 1200 km between Site_A and Site_B
Now propagating between Site_A and Site_B:
Reference used for design: (Input optical power reference in span = 0.00dBm,
spacing = 50.00GHz
nb_channels = 95)
Propagating with input power = 0.00 dBm:
Channels propagating: (Input optical power deviation in span = mode_1: 0.00, mode_2: 0.00dB,
spacing = mode_1: 50.00, mode_2: 75.00GHz,
transceiver output power = mode_1: 0.00, mode_2: 0.00dBm,
nb_channels = 60)
Input optical power reference in span = 0.00 dBm:
Transceiver Site_A
GSNR (0.1nm, dB): mode_1: 40.00, mode_2: 40.00
GSNR (signal bw, dB): mode_1: 35.92, mode_2: 32.91
@@ -17,14 +23,18 @@ Transceiver Site_A
PMD (ps): 0.00
PDL (dB): 0.00
Latency (ms): 0.00
Actual pch out (dBm): mode_1: 0.00, mode_2: 0.00
Roadm roadm Site A
effective loss (dB): 20.00
reference pch out (dBm): -20.00
actual pch out (dBm): mode_1: -20.00, mode_2: -18.24
Type_variety: default
Reference loss (dB): 20.00
Actual loss (dB): mode_1: 20.00, mode_2: 18.24
Reference pch out (dBm): -20.00
Actual pch out (dBm): mode_1: -20.00, mode_2: -18.24
Edfa booster A
type_variety: std_medium_gain
effective gain(dB): 20.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 6.58
(including att_in)
pad att_in (dB): 0.00
@@ -47,6 +57,7 @@ Edfa Edfa1
type_variety: test
effective gain(dB): 16.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 8.86
(including att_in)
pad att_in (dB): 0.00
@@ -69,6 +80,7 @@ Edfa Edfa2
type_variety: test_fixed_gain
effective gain(dB): 16.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 9.00
(including att_in)
pad att_in (dB): 4.00
@@ -91,6 +103,7 @@ Edfa Edfa3
type_variety: test
effective gain(dB): 16.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 8.86
(including att_in)
pad att_in (dB): 0.00
@@ -113,6 +126,7 @@ Edfa Edfa4
type_variety: test_fixed_gain
effective gain(dB): 16.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 9.00
(including att_in)
pad att_in (dB): 4.00
@@ -135,6 +149,7 @@ Edfa Edfa5
type_variety: test
effective gain(dB): 16.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 8.86
(including att_in)
pad att_in (dB): 0.00
@@ -145,13 +160,16 @@ Edfa Edfa5
actual pch out (dBm): mode_1: 0.05, mode_2: 1.82
output VOA (dB): 0.00
Roadm roadm Site C
effective loss (dB): 20.00
reference pch out (dBm): -20.00
actual pch out (dBm): mode_1: -20.00, mode_2: -18.24
Type_variety: default
Reference loss (dB): 20.00
Actual loss (dB): mode_1: 20.05, mode_2: 20.06
Reference pch out (dBm): -20.00
Actual pch out (dBm): mode_1: -20.00, mode_2: -18.24
Edfa booster C
type_variety: std_medium_gain
effective gain(dB): 20.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 6.58
(including att_in)
pad att_in (dB): 0.00
@@ -174,6 +192,7 @@ Edfa Edfa6
type_variety: test_fixed_gain
effective gain(dB): 16.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 9.00
(including att_in)
pad att_in (dB): 4.00
@@ -196,6 +215,7 @@ Edfa Edfa7
type_variety: test
effective gain(dB): 16.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 8.86
(including att_in)
pad att_in (dB): 0.00
@@ -218,6 +238,7 @@ Edfa Edfa8
type_variety: test_fixed_gain
effective gain(dB): 16.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 9.00
(including att_in)
pad att_in (dB): 4.00
@@ -240,6 +261,7 @@ Edfa Edfa9
type_variety: test
effective gain(dB): 16.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 8.86
(including att_in)
pad att_in (dB): 0.00
@@ -262,6 +284,7 @@ Edfa Edfa10
type_variety: test_fixed_gain
effective gain(dB): 16.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 9.00
(including att_in)
pad att_in (dB): 4.00
@@ -272,13 +295,16 @@ Edfa Edfa10
actual pch out (dBm): mode_1: 0.05, mode_2: 1.82
output VOA (dB): 0.00
Roadm roadm Site D
effective loss (dB): 20.00
reference pch out (dBm): -20.00
actual pch out (dBm): mode_1: -20.00, mode_2: -18.24
Type_variety: default
Reference loss (dB): 20.00
Actual loss (dB): mode_1: 20.05, mode_2: 20.06
Reference pch out (dBm): -20.00
Actual pch out (dBm): mode_1: -20.00, mode_2: -18.24
Edfa booster D
type_variety: std_medium_gain
effective gain(dB): 20.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 6.58
(including att_in)
pad att_in (dB): 0.00
@@ -301,6 +327,7 @@ Edfa Edfa11
type_variety: test
effective gain(dB): 16.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 8.86
(including att_in)
pad att_in (dB): 0.00
@@ -323,6 +350,7 @@ Edfa Edfa12
type_variety: test_fixed_gain
effective gain(dB): 16.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 9.00
(including att_in)
pad att_in (dB): 4.00
@@ -333,13 +361,16 @@ Edfa Edfa12
actual pch out (dBm): mode_1: 0.03, mode_2: 1.79
output VOA (dB): 0.00
Roadm roadm Site E
effective loss (dB): 20.00
reference pch out (dBm): -20.00
actual pch out (dBm): mode_1: -20.00, mode_2: -18.24
Type_variety: default
Reference loss (dB): 20.00
Actual loss (dB): mode_1: 20.03, mode_2: 20.03
Reference pch out (dBm): -20.00
Actual pch out (dBm): mode_1: -20.00, mode_2: -18.24
Edfa booster E
type_variety: std_medium_gain
effective gain(dB): 20.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 6.58
(including att_in)
pad att_in (dB): 0.00
@@ -362,6 +393,7 @@ Edfa Edfa13
type_variety: test
effective gain(dB): 16.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 8.86
(including att_in)
pad att_in (dB): 0.00
@@ -384,6 +416,7 @@ Edfa Edfa14
type_variety: test_fixed_gain
effective gain(dB): 16.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 9.00
(including att_in)
pad att_in (dB): 4.00
@@ -406,6 +439,7 @@ Edfa Edfa15
type_variety: test
effective gain(dB): 16.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 8.86
(including att_in)
pad att_in (dB): 0.00
@@ -416,9 +450,11 @@ Edfa Edfa15
actual pch out (dBm): mode_1: 0.03, mode_2: 1.80
output VOA (dB): 0.00
Roadm roadm Site B
effective loss (dB): 20.00
reference pch out (dBm): -20.00
actual pch out (dBm): mode_1: -20.00, mode_2: -18.24
Type_variety: default
Reference loss (dB): 20.00
Actual loss (dB): mode_1: 20.03, mode_2: 20.04
Reference pch out (dBm): -20.00
Actual pch out (dBm): mode_1: -20.00, mode_2: -18.24
Transceiver Site_B
GSNR (0.1nm, dB): mode_1: 18.02, mode_2: 20.22
GSNR (signal bw, dB): mode_1: 13.94, mode_2: 13.12
@@ -428,8 +464,9 @@ Transceiver Site_B
PMD (ps): 1.39
PDL (dB): 0.00
Latency (ms): 5.88
Actual pch out (dBm): mode_1: 0.00, mode_2: 0.00
Transmission result for input power = 0.00 dBm:
Transmission result for input optical power reference in span = 0.00 dBm:
Final GSNR (0.1 nm): 18.94 dB
(No source node specified: picked Site_A)

View File

@@ -1,12 +1,18 @@
There are 76 channels propagating
Power mode is set to True
=> it can be modified in eqpt_config.json - Span
There are 1 fiber spans over 80 km between Site_A and Site_B
Now propagating between Site_A and Site_B:
Reference used for design: (Input optical power reference in span = 0.00dBm,
spacing = 50.00GHz
nb_channels = 76)
Propagating with input power = 0.00 dBm:
Channels propagating: (Input optical power deviation in span = 0.00dB,
spacing = 50.00GHz,
transceiver output power = 0.00dBm,
nb_channels = 76)
Input optical power reference in span = 0.00 dBm:
Transceiver Site_A
GSNR (0.1nm, dB): 40.00
GSNR (signal bw, dB): 35.92
@@ -16,6 +22,7 @@ Transceiver Site_A
PMD (ps): 0.00
PDL (dB): 0.00
Latency (ms): 0.00
Actual pch out (dBm): 0.00
Fiber Span1
type_variety: SSMF
length (km): 80.00
@@ -29,6 +36,7 @@ Edfa Edfa1
type_variety: std_low_gain
effective gain(dB): 15.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 6.62
(including att_in)
pad att_in (dB): 0.00
@@ -47,8 +55,9 @@ Transceiver Site_B
PMD (ps): 0.36
PDL (dB): 0.00
Latency (ms): 0.39
Actual pch out (dBm): 0.00
Transmission result for input power = 0.00 dBm:
Transmission result for input optical power reference in span = 0.00 dBm:
Final GSNR (0.1 nm): 31.18 dB
(No source node specified: picked Site_A)

View File

@@ -1,12 +1,18 @@
There are 76 channels propagating
Power mode is set to True
=> it can be modified in eqpt_config.json - Span
There are 1 fiber spans over 80 km between Site_A and Site_B
Now propagating between Site_A and Site_B:
Reference used for design: (Input optical power reference in span = 0.00dBm,
spacing = 50.00GHz
nb_channels = 76)
Propagating with input power = 0.00 dBm:
Channels propagating: (Input optical power deviation in span = 0.00dB,
spacing = 50.00GHz,
transceiver output power = 0.00dBm,
nb_channels = 76)
Input optical power reference in span = 0.00 dBm:
Transceiver Site_A
GSNR (0.1nm, dB): 40.00
GSNR (signal bw, dB): 35.92
@@ -16,6 +22,7 @@ Transceiver Site_A
PMD (ps): 0.00
PDL (dB): 0.00
Latency (ms): 0.00
Actual pch out (dBm): 0.00
RamanFiber Span1
type_variety: SSMF
length (km): 80.00
@@ -25,112 +32,116 @@ RamanFiber Span1
(conn loss out includes EOL margin defined in eqpt_config.json)
reference pch out (dBm): -7.20
actual pch out (dBm): -7.47
reference gain (dB): 9.74
actual gain (dB): 9.8
Fused Fused1
loss (dB): 0.00
Edfa Edfa1
type_variety: std_low_gain
effective gain(dB): 5.20
effective gain(dB): 5.26
(before att_in and before output VOA)
noise figure (dB): 13.80
tilt-target(dB) 0.00
noise figure (dB): 13.74
(including att_in)
pad att_in (dB): 2.80
pad att_in (dB): 2.74
Power In (dBm): 11.61
Power Out (dBm): 16.81
Power Out (dBm): 16.87
Delta_P (dB): -2.00
target pch (dBm): -2.00
actual pch out (dBm): -2.26
actual pch out (dBm): -2.21
output VOA (dB): 0.00
Transceiver Site_B
GSNR (0.1nm, dB): 31.42
GSNR (signal bw, dB): 27.34
OSNR ASE (0.1nm, dB): 34.21
OSNR ASE (signal bw, dB): 30.13
GSNR (0.1nm, dB): 31.44
GSNR (signal bw, dB): 27.35
OSNR ASE (0.1nm, dB): 34.24
OSNR ASE (signal bw, dB): 30.16
CD (ps/nm): 1336.00
PMD (ps): 0.36
PDL (dB): 0.00
Latency (ms): 0.39
Actual pch out (dBm): 0.00
Transmission result for input power = 0.00 dBm:
Final GSNR (0.1 nm): 31.42 dB
Transmission result for input optical power reference in span = 0.00 dBm:
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.35000 0.22 31.64 31.55 28.58
2 191.40000 0.18 31.62 31.46 28.53
3 191.45000 0.15 31.60 31.37 28.47
4 191.50000 0.11 31.58 31.28 28.42
5 191.55000 0.05 31.54 31.20 28.36
6 191.60000 -0.01 31.51 31.11 28.30
7 191.65000 -0.07 31.48 31.03 28.24
8 191.70000 -0.12 31.45 30.95 28.18
9 191.75000 -0.18 31.42 30.87 28.13
10 191.80000 -0.25 31.38 30.79 28.07
11 191.85000 -0.31 31.35 30.72 28.01
12 191.90000 -0.38 31.31 30.64 27.95
13 191.95000 -0.44 31.27 30.57 27.90
14 192.00000 -0.51 31.24 30.50 27.84
15 192.05000 -0.58 31.20 30.42 27.78
16 192.10000 -0.64 31.16 30.35 27.73
17 192.15000 -0.71 31.12 30.29 27.67
18 192.20000 -0.78 31.08 30.22 27.62
19 192.25000 -0.85 31.04 30.22 27.60
20 192.30000 -0.93 31.00 30.22 27.58
21 192.35000 -1.00 30.96 30.23 27.57
22 192.40000 -1.08 30.91 30.23 27.55
23 192.45000 -1.16 30.87 30.23 27.53
24 192.50000 -1.23 30.82 30.24 27.51
25 192.55000 -1.30 30.78 30.24 27.49
26 192.60000 -1.37 30.74 30.24 27.47
27 192.65000 -1.44 30.70 30.25 27.46
28 192.70000 -1.52 30.65 30.25 27.44
29 192.75000 -1.59 30.61 30.25 27.42
30 192.80000 -1.66 30.57 30.26 27.40
31 192.85000 -1.73 30.52 30.26 27.38
32 192.90000 -1.80 30.48 30.26 27.36
33 192.95000 -1.87 30.43 30.27 27.34
34 193.00000 -1.94 30.39 30.27 27.32
35 193.05000 -2.01 30.35 30.27 27.30
36 193.10000 -2.08 30.30 30.28 27.28
37 193.15000 -2.15 30.26 30.28 27.26
38 193.20000 -2.22 30.22 30.29 27.24
39 193.25000 -2.29 30.17 30.31 27.23
40 193.30000 -2.36 30.13 30.32 27.21
41 193.35000 -2.43 30.08 30.33 27.19
42 193.40000 -2.50 30.04 30.35 27.18
43 193.45000 -2.56 29.99 30.36 27.16
44 193.50000 -2.63 29.95 30.37 27.14
45 193.55000 -2.71 29.90 30.39 27.12
46 193.60000 -2.78 29.85 30.40 27.11
47 193.65000 -2.85 29.80 30.41 27.09
48 193.70000 -2.93 29.75 30.43 27.07
49 193.75000 -3.00 29.70 30.44 27.05
50 193.80000 -3.07 29.65 30.45 27.02
51 193.85000 -3.15 29.60 30.47 27.00
52 193.90000 -3.22 29.55 30.48 26.98
53 193.95000 -3.29 29.50 30.50 26.96
54 194.00000 -3.37 29.45 30.51 26.94
55 194.05000 -3.44 29.40 30.52 26.92
56 194.10000 -3.52 29.35 30.54 26.89
57 194.15000 -3.59 29.30 30.59 26.89
58 194.20000 -3.66 29.25 30.64 26.88
59 194.25000 -3.74 29.19 30.70 26.87
60 194.30000 -3.81 29.14 30.75 26.86
61 194.35000 -3.89 29.09 30.81 26.86
62 194.40000 -3.96 29.04 30.87 26.85
63 194.45000 -4.04 28.98 30.93 26.84
64 194.50000 -4.11 28.93 30.98 26.83
65 194.55000 -4.18 28.88 31.04 26.82
66 194.60000 -4.25 28.83 31.10 26.81
67 194.65000 -4.31 28.78 31.17 26.80
68 194.70000 -4.38 28.74 31.23 26.79
69 194.75000 -4.45 28.69 31.29 26.79
70 194.80000 -4.51 28.64 31.35 26.78
71 194.85000 -4.58 28.59 31.42 26.77
72 194.90000 -4.65 28.54 31.48 26.76
73 194.95000 -4.71 28.49 31.55 26.74
74 195.00000 -4.78 28.44 31.62 26.73
75 195.05000 -4.85 28.39 31.69 26.72
76 195.10000 -4.91 28.34 31.69 26.69
1 191.35000 0.27 31.66 31.55 28.60
2 191.40000 0.24 31.64 31.46 28.54
3 191.45000 0.20 31.62 31.37 28.48
4 191.50000 0.17 31.60 31.28 28.43
5 191.55000 0.11 31.57 31.20 28.37
6 191.60000 0.05 31.54 31.11 28.31
7 191.65000 -0.01 31.51 31.03 28.25
8 191.70000 -0.07 31.47 30.95 28.20
9 191.75000 -0.13 31.44 30.87 28.14
10 191.80000 -0.19 31.41 30.79 28.08
11 191.85000 -0.26 31.37 30.72 28.02
12 191.90000 -0.32 31.34 30.64 27.97
13 191.95000 -0.39 31.30 30.57 27.91
14 192.00000 -0.45 31.26 30.50 27.85
15 192.05000 -0.52 31.23 30.42 27.80
16 192.10000 -0.59 31.19 30.35 27.74
17 192.15000 -0.66 31.15 30.29 27.69
18 192.20000 -0.72 31.11 30.22 27.63
19 192.25000 -0.79 31.07 30.22 27.62
20 192.30000 -0.87 31.03 30.22 27.60
21 192.35000 -0.95 30.99 30.23 27.58
22 192.40000 -1.02 30.94 30.23 27.56
23 192.45000 -1.10 30.90 30.23 27.54
24 192.50000 -1.18 30.85 30.24 27.52
25 192.55000 -1.25 30.81 30.24 27.51
26 192.60000 -1.32 30.77 30.24 27.49
27 192.65000 -1.39 30.73 30.25 27.47
28 192.70000 -1.46 30.68 30.25 27.45
29 192.75000 -1.53 30.64 30.25 27.43
30 192.80000 -1.60 30.60 30.26 27.41
31 192.85000 -1.67 30.55 30.26 27.39
32 192.90000 -1.74 30.51 30.26 27.37
33 192.95000 -1.81 30.47 30.27 27.35
34 193.00000 -1.89 30.42 30.27 27.33
35 193.05000 -1.95 30.38 30.27 27.32
36 193.10000 -2.02 30.34 30.28 27.30
37 193.15000 -2.09 30.29 30.28 27.28
38 193.20000 -2.16 30.25 30.29 27.26
39 193.25000 -2.23 30.20 30.31 27.24
40 193.30000 -2.30 30.16 30.32 27.23
41 193.35000 -2.37 30.11 30.33 27.21
42 193.40000 -2.44 30.07 30.35 27.20
43 193.45000 -2.51 30.02 30.36 27.18
44 193.50000 -2.58 29.98 30.37 27.16
45 193.55000 -2.65 29.93 30.39 27.14
46 193.60000 -2.72 29.88 30.40 27.12
47 193.65000 -2.80 29.83 30.41 27.10
48 193.70000 -2.87 29.79 30.43 27.08
49 193.75000 -2.94 29.74 30.44 27.06
50 193.80000 -3.02 29.69 30.45 27.04
51 193.85000 -3.09 29.64 30.47 27.02
52 193.90000 -3.16 29.59 30.48 27.00
53 193.95000 -3.24 29.54 30.50 26.98
54 194.00000 -3.31 29.49 30.51 26.96
55 194.05000 -3.38 29.44 30.52 26.94
56 194.10000 -3.46 29.39 30.54 26.91
57 194.15000 -3.53 29.33 30.59 26.91
58 194.20000 -3.61 29.28 30.64 26.90
59 194.25000 -3.68 29.23 30.70 26.89
60 194.30000 -3.76 29.18 30.75 26.89
61 194.35000 -3.83 29.13 30.81 26.88
62 194.40000 -3.91 29.07 30.87 26.87
63 194.45000 -3.98 29.02 30.93 26.86
64 194.50000 -4.05 28.97 30.98 26.85
65 194.55000 -4.12 28.92 31.04 26.84
66 194.60000 -4.19 28.87 31.10 26.84
67 194.65000 -4.26 28.82 31.17 26.83
68 194.70000 -4.32 28.77 31.23 26.82
69 194.75000 -4.39 28.72 31.29 26.81
70 194.80000 -4.46 28.68 31.35 26.80
71 194.85000 -4.52 28.63 31.42 26.79
72 194.90000 -4.59 28.58 31.48 26.78
73 194.95000 -4.66 28.53 31.55 26.77
74 195.00000 -4.72 28.48 31.62 26.76
75 195.05000 -4.79 28.43 31.69 26.75
76 195.10000 -4.86 28.38 31.69 26.71
(No source node specified: picked Site_A)

View File

@@ -1,12 +1,18 @@
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:
Reference used for design: (Input optical power reference in span = 0.00dBm,
spacing = 50.00GHz
nb_channels = 96)
Propagating with input power = 0.00 dBm:
Channels propagating: (Input optical power deviation in span = 0.00dB,
spacing = 50.00GHz,
transceiver output power = 0.00dBm,
nb_channels = 96)
Input optical power reference in span = 0.00 dBm:
Transceiver Site_A
GSNR (0.1nm, dB): 100.00
GSNR (signal bw, dB): 95.92
@@ -16,14 +22,18 @@ Transceiver Site_A
PMD (ps): 0.00
PDL (dB): 0.00
Latency (ms): 0.00
Actual pch out (dBm): 0.00
Roadm roadm Site A
effective loss (dB): 20.00
reference pch out (dBm): -20.00
actual pch out (dBm): -20.00
Type_variety: default
Reference loss (dB): 20.00
Actual 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)
tilt-target(dB) 0.00
noise figure (dB): 6.58
(including att_in)
pad att_in (dB): 0.00
@@ -46,6 +56,7 @@ Edfa Edfa1
type_variety: test
effective gain(dB): 16.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 8.86
(including att_in)
pad att_in (dB): 0.00
@@ -68,6 +79,7 @@ Edfa Edfa2
type_variety: test_fixed_gain
effective gain(dB): 16.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 9.00
(including att_in)
pad att_in (dB): 4.00
@@ -90,6 +102,7 @@ Edfa Edfa3
type_variety: test
effective gain(dB): 16.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 8.86
(including att_in)
pad att_in (dB): 0.00
@@ -112,6 +125,7 @@ Edfa Edfa4
type_variety: test_fixed_gain
effective gain(dB): 16.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 9.00
(including att_in)
pad att_in (dB): 4.00
@@ -134,6 +148,7 @@ Edfa Edfa5
type_variety: test
effective gain(dB): 16.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 8.86
(including att_in)
pad att_in (dB): 0.00
@@ -144,13 +159,16 @@ Edfa Edfa5
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
Type_variety: default
Reference loss (dB): 20.00
Actual loss (dB): 20.06
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)
tilt-target(dB) 0.00
noise figure (dB): 6.58
(including att_in)
pad att_in (dB): 0.00
@@ -173,6 +191,7 @@ Edfa Edfa6
type_variety: test_fixed_gain
effective gain(dB): 16.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 9.00
(including att_in)
pad att_in (dB): 4.00
@@ -195,6 +214,7 @@ Edfa Edfa7
type_variety: test
effective gain(dB): 16.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 8.86
(including att_in)
pad att_in (dB): 0.00
@@ -217,6 +237,7 @@ Edfa Edfa8
type_variety: test_fixed_gain
effective gain(dB): 16.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 9.00
(including att_in)
pad att_in (dB): 4.00
@@ -239,6 +260,7 @@ Edfa Edfa9
type_variety: test
effective gain(dB): 16.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 8.86
(including att_in)
pad att_in (dB): 0.00
@@ -261,6 +283,7 @@ Edfa Edfa10
type_variety: test_fixed_gain
effective gain(dB): 16.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 9.00
(including att_in)
pad att_in (dB): 4.00
@@ -271,13 +294,16 @@ Edfa Edfa10
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
Type_variety: default
Reference loss (dB): 20.00
Actual loss (dB): 20.06
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)
tilt-target(dB) 0.00
noise figure (dB): 6.58
(including att_in)
pad att_in (dB): 0.00
@@ -300,6 +326,7 @@ Edfa Edfa11
type_variety: test
effective gain(dB): 16.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 8.86
(including att_in)
pad att_in (dB): 0.00
@@ -322,6 +349,7 @@ Edfa Edfa12
type_variety: test_fixed_gain
effective gain(dB): 16.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 9.00
(including att_in)
pad att_in (dB): 4.00
@@ -332,13 +360,16 @@ Edfa Edfa12
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
Type_variety: default
Reference loss (dB): 20.00
Actual loss (dB): 20.03
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)
tilt-target(dB) 0.00
noise figure (dB): 6.58
(including att_in)
pad att_in (dB): 0.00
@@ -361,6 +392,7 @@ Edfa Edfa13
type_variety: test
effective gain(dB): 16.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 8.86
(including att_in)
pad att_in (dB): 0.00
@@ -383,6 +415,7 @@ Edfa Edfa14
type_variety: test_fixed_gain
effective gain(dB): 16.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 9.00
(including att_in)
pad att_in (dB): 4.00
@@ -405,6 +438,7 @@ Edfa Edfa15
type_variety: test
effective gain(dB): 16.00
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 8.86
(including att_in)
pad att_in (dB): 0.00
@@ -415,9 +449,11 @@ Edfa Edfa15
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
Type_variety: default
Reference loss (dB): 20.00
Actual loss (dB): 20.04
Reference pch out (dBm): -20.00
Actual pch out (dBm): -20.00
Transceiver Site_B
GSNR (0.1nm, dB): 17.84
GSNR (signal bw, dB): 13.76
@@ -427,8 +463,9 @@ Transceiver Site_B
PMD (ps): 1.39
PDL (dB): 0.00
Latency (ms): 5.88
Actual pch out (dBm): 0.00
Transmission result for input power = 0.00 dBm:
Transmission result for input optical power reference in span = 0.00 dBm:
Final GSNR (0.1 nm): 17.84 dB
(No source node specified: picked Site_A)

View File

@@ -1,12 +1,18 @@
There are 96 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:
Reference used for design: (Input optical power reference in span = 3.00dBm,
spacing = 50.00GHz
nb_channels = 96)
Propagating with input power = 3.00 dBm:
Channels propagating: (Input optical power deviation in span = 0.00dB,
spacing = 50.00GHz,
transceiver output power = 3.00dBm,
nb_channels = 96)
Input optical power reference in span = 3.00 dBm:
Transceiver trx Lannion_CAS
GSNR (0.1nm, dB): 100.00
GSNR (signal bw, dB): 95.92
@@ -16,14 +22,18 @@ Transceiver trx Lannion_CAS
PMD (ps): 0.00
PDL (dB): 0.00
Latency (ms): 0.00
Actual pch out (dBm): 3.00
Roadm roadm Lannion_CAS
effective loss (dB): 23.00
reference pch out (dBm): -20.00
actual pch out (dBm): -20.00
Type_variety: default
Reference loss (dB): 23.00
Actual loss (dB): 23.00
Reference pch out (dBm): -20.00
Actual pch out (dBm): -20.00
Edfa east edfa in Lannion_CAS to Corlay
type_variety: test
effective gain(dB): 21.18
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 6.13
(including att_in)
pad att_in (dB): 0.00
@@ -68,6 +78,7 @@ Edfa west edfa in Lorient_KMA to Loudeac
type_variety: std_medium_gain
effective gain(dB): 27.99
(before att_in and before output VOA)
tilt-target(dB) 0.00
noise figure (dB): 5.98
(including att_in)
pad att_in (dB): 0.00
@@ -78,9 +89,11 @@ Edfa west edfa in Lorient_KMA to Loudeac
actual pch out (dBm): 1.21
output VOA (dB): 0.00
Roadm roadm Lorient_KMA
effective loss (dB): 21.18
reference pch out (dBm): -20.00
actual pch out (dBm): -20.00
Type_variety: default
Reference loss (dB): 21.18
Actual loss (dB): 21.21
Reference pch out (dBm): -20.00
Actual pch out (dBm): -20.00
Transceiver trx Lorient_KMA
GSNR (0.1nm, dB): 23.77
GSNR (signal bw, dB): 19.69
@@ -90,8 +103,9 @@ Transceiver trx Lorient_KMA
PMD (ps): 0.46
PDL (dB): 0.00
Latency (ms): 0.64
Actual pch out (dBm): 3.00
Transmission result for input power = 3.00 dBm:
Transmission result for input optical power reference in span = 3.00 dBm:
Final GSNR (0.1 nm): 23.77 dB
(Invalid source node 'lannion' replaced with trx Lannion_CAS)

View File

@@ -9,7 +9,7 @@ from gnpy.core.elements import Transceiver, Edfa, Fiber
from gnpy.core.utils import automatic_fmax, lin2db, db2lin, merge_amplifier_restrictions, dbm2watt, watt2dbm
from gnpy.core.info import create_input_spectral_information, create_arbitrary_spectral_information
from gnpy.core.network import build_network, set_amplifier_voa
from gnpy.tools.json_io import load_network, load_equipment, network_from_json
from gnpy.tools.json_io import load_network, load_equipment, load_json, _equipment_from_json, network_from_json
from pathlib import Path
import pytest
@@ -17,6 +17,8 @@ TEST_DIR = Path(__file__).parent
DATA_DIR = TEST_DIR / 'data'
test_network = DATA_DIR / 'test_network.json'
eqpt_library = DATA_DIR / 'eqpt_config.json'
extra_configs = {"std_medium_gain_advanced_config.json": DATA_DIR / "std_medium_gain_advanced_config.json",
"Juniper-BoosterHG.json": DATA_DIR / "Juniper-BoosterHG.json"}
# TODO in elements.py code: pytests doesn't pass with 1 channel: interpolate fail
@@ -39,7 +41,7 @@ def bw():
def setup_edfa_variable_gain():
"""init edfa class by reading test_network.json file
remove all gain and nf ripple"""
equipment = load_equipment(eqpt_library)
equipment = load_equipment(eqpt_library, extra_configs)
network = load_network(test_network, equipment)
build_network(network, equipment, 0, 20)
edfa = [n for n in network.nodes() if isinstance(n, Edfa)][0]
@@ -51,7 +53,7 @@ def setup_edfa_variable_gain():
@pytest.fixture()
def setup_edfa_fixed_gain():
"""init edfa class by reading the 2nd edfa in test_network.json file"""
equipment = load_equipment(eqpt_library)
equipment = load_equipment(eqpt_library, extra_configs)
network = load_network(test_network, equipment)
build_network(network, equipment, 0, 20)
edfa = [n for n in network.nodes() if isinstance(n, Edfa)][1]
@@ -61,7 +63,7 @@ def setup_edfa_fixed_gain():
@pytest.fixture()
def setup_trx():
"""init transceiver class to access snr and osnr calculations"""
equipment = load_equipment(eqpt_library)
equipment = load_equipment(eqpt_library, extra_configs)
network = load_network(test_network, equipment)
build_network(network, equipment, 0, 20)
trx = [n for n in network.nodes() if isinstance(n, Transceiver)][0]
@@ -74,8 +76,8 @@ 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_min, f_max=f_max, roll_off=0.15, baud_rate=bw, power=1e-3,
spacing=spacing, tx_osnr=40.0)
return create_input_spectral_information(f_min=f_min, f_max=f_max, roll_off=0.15, baud_rate=bw,
spacing=spacing, tx_osnr=40.0, tx_power=1e-3)
@pytest.mark.parametrize("gain, nf_expected", [(10, 15), (15, 10), (25, 5.8)])
@@ -144,7 +146,7 @@ def test_compare_nf_models(gain, setup_edfa_variable_gain, si):
}
}
}
equipment = load_equipment(eqpt_library)
equipment = load_equipment(eqpt_library, extra_configs)
extra_params = equipment['Edfa']['CienaDB_medium_gain']
temp = el_config.setdefault('params', {})
temp = merge_amplifier_restrictions(temp, extra_params.__dict__)
@@ -165,7 +167,7 @@ def test_ase_noise(gain, si, setup_trx, bw):
2-pout/pase afet propagate
3-Transceiver osnr_ase_01nm
=> unitary test for Edfa.noise_profile (Edfa.interpol_params, Edfa.propagate)"""
equipment = load_equipment(eqpt_library)
equipment = load_equipment(eqpt_library, extra_configs)
network = load_network(test_network, equipment)
edfa = next(n for n in network.nodes() if n.uid == 'Edfa1')
span = next(n for n in network.nodes() if n.uid == 'Span1')
@@ -225,15 +227,15 @@ def test_amp_behaviour(tilt_target, delta_p):
}],
"connections": []
}
equipment = load_equipment(eqpt_library)
equipment = load_equipment(eqpt_library, extra_configs)
network = network_from_json(json_data, equipment)
edfa = [n for n in network.nodes() if isinstance(n, Edfa)][0]
fiber = [n for n in network.nodes() if isinstance(n, Fiber)][0]
fiber.params.con_in = 0
fiber.params.con_out = 0
fiber.ref_pch_in_dbm = 0.0
si = create_input_spectral_information(f_min=191.3e12, f_max=196.05e12, roll_off=0.15, baud_rate=64e9, power=0.001,
spacing=75e9, tx_osnr=None)
si = create_input_spectral_information(f_min=191.3e12, f_max=196.05e12, roll_off=0.15, baud_rate=64e9,
spacing=75e9, tx_osnr=None, tx_power=1e-3)
si = fiber(si)
total_sig_powerin = sum(si.signal)
sig_in = lin2db(si.signal)
@@ -251,35 +253,35 @@ def test_amp_behaviour(tilt_target, delta_p):
else:
if delta_p != 2:
expected_sig_out = [
-32.00529182, -31.93540907, -31.86554231, -31.79417979, -31.71903263,
-31.6424009, -31.56531159, -31.48775435, -31.41468382, -31.35973323,
-31.32286555, -31.28602346, -31.2472908, -31.20086569, -31.14671746,
-31.08702653, -31.01341963, -30.93430243, -30.87791656, -30.84413339,
-30.81605918, -30.78824936, -30.76071036, -30.73319161, -30.70494101,
-30.67368479, -30.63941012, -30.60178381, -30.55585766, -30.5066561,
-30.43426575, -30.33848379, -30.24471112, -30.18220815, -30.15076699,
-30.11934744, -30.08776718, -30.05548097, -30.02250068, -29.98954302,
-29.95661362, -29.92370274, -29.8854762, -29.84193785, -29.79238328,
-29.72452662, -29.6385071, -29.54788144, -29.44581202, -29.33924103,
-29.23276107, -29.10289365, -28.91425473, -28.70204648, -28.50670713,
-28.3282514, -28.15895225, -28.009065, -27.87864672, -27.76315964,
-27.68523133, -27.62260405, -27.58076622]
-31.95025022, -31.88168886, -31.81178634, -31.73838831, -31.66318631,
-31.58762141, -31.51156294, -31.43760161, -31.38124626, -31.34245197,
-31.30629475, -31.26970711, -31.22566555, -31.17412914, -31.11806869,
-31.05122228, -30.97358131, -30.90658619, -30.86616148, -30.83854197,
-30.81115028, -30.78403337, -30.7570206, -30.73002834, -30.70088634,
-30.66844432, -30.63427939, -30.59364514, -30.54659009, -30.49180643,
-30.41406352, -30.31434813, -30.22984104, -30.18249387, -30.1516453,
-30.12082034, -30.08970494, -30.05779424, -30.02543415, -29.99309889,
-29.96078803, -29.92798594, -29.89002127, -29.84689015, -29.79726968,
-29.72927112, -29.64485972, -29.55578693, -29.45569694, -29.35111795,
-29.24662471, -29.12148491, -28.94244964, -28.73421833, -28.53930479,
-28.36231261, -28.19361236, -28.04376778, -27.91280403, -27.79433658,
-27.7065072, -27.64495288, -27.59798975]
else:
expected_sig_out = [
-30.00529182, -29.93540907, -29.86554231, -29.79417979, -29.71903263,
-29.6424009, -29.56531159, -29.48775435, -29.41468382, -29.35973323,
-29.32286555, -29.28602346, -29.2472908, -29.20086569, -29.14671746,
-29.08702653, -29.01341963, -28.93430243, -28.87791656, -28.84413339,
-28.81605918, -28.78824936, -28.76071036, -28.73319161, -28.70494101,
-28.67368479, -28.63941012, -28.60178381, -28.55585766, -28.5066561,
-28.43426575, -28.33848379, -28.24471112, -28.18220815, -28.15076699,
-28.11934744, -28.08776718, -28.05548097, -28.02250068, -27.98954302,
-27.95661362, -27.92370274, -27.8854762, -27.84193785, -27.79238328,
-27.72452662, -27.6385071, -27.54788144, -27.44581202, -27.33924103,
-27.23276107, -27.10289365, -26.91425473, -26.70204648, -26.50670713,
-26.3282514, -26.15895225, -26.009065, -25.87864672, -25.76315964,
-25.68523133, -25.62260405, -25.58076622]
-29.95025022, -29.88168886, -29.81178634, -29.73838831, -29.66318631,
-29.58762141, -29.51156294, -29.43760161, -29.38124626, -29.34245197,
-29.30629475, -29.26970711, -29.22566555, -29.17412914, -29.11806869,
-29.05122228, -28.97358131, -28.90658619, -28.86616148, -28.83854197,
-28.81115028, -28.78403337, -28.7570206, -28.73002834, -28.70088634,
-28.66844432, -28.63427939, -28.59364514, -28.54659009, -28.49180643,
-28.41406352, -28.31434813, -28.22984104, -28.18249387, -28.1516453,
-28.12082034, -28.08970494, -28.05779424, -28.02543415, -27.99309889,
-27.96078803, -27.92798594, -27.89002127, -27.84689015, -27.79726968,
-27.72927112, -27.64485972, -27.55578693, -27.45569694, -27.35111795,
-27.24662471, -27.12148491, -26.94244964, -26.73421833, -26.53930479,
-26.36231261, -26.19361236, -26.04376778, -25.91280403, -25.79433658,
-25.7065072, -25.64495288, -25.59798975]
print(sig_out)
assert_allclose(sig_out, expected_sig_out, rtol=1e-9)
@@ -310,7 +312,7 @@ def test_amp_saturation(delta_pdb_per_channel, base_power, delta_p):
}],
"connections": []
}
equipment = load_equipment(eqpt_library)
equipment = load_equipment(eqpt_library, extra_configs)
network = network_from_json(json_data, equipment)
edfa = [n for n in network.nodes()][0]
frequency = 193e12 + array([0, 50e9, 150e9, 225e9, 275e9])
@@ -320,7 +322,7 @@ def test_amp_saturation(delta_pdb_per_channel, base_power, delta_p):
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)
tx_osnr=None, tx_power=None)
total_sig_powerin = sum(si.signal)
sig_in = lin2db(si.signal)
si = edfa(si)
@@ -354,7 +356,7 @@ def test_set_out_voa():
}],
"connections": []
}
equipment = load_equipment(eqpt_library)
equipment = load_equipment(eqpt_library, extra_configs)
network = network_from_json(json_data, equipment)
amp = [n for n in network.nodes()][0]
print(amp.out_voa)
@@ -365,3 +367,305 @@ def test_set_out_voa():
assert amp.out_voa == 4.0
assert amp.effective_gain == 20.0 + 4.0
assert amp.delta_p == -3.0 + 4.0
def test_multiband():
equipment_json = load_json(eqpt_library)
# add some multiband amplifiers
amps = [
{
"type_variety": "std_medium_gain_C",
"f_min": 191.25e12,
"f_max": 196.15e12,
"type_def": "variable_gain",
"gain_flatmax": 26,
"gain_min": 15,
"p_max": 21,
"nf_min": 6,
"nf_max": 10,
"out_voa_auto": False,
"allowed_for_design": True},
{
"type_variety": "std_medium_gain_L",
"f_min": 186.55e12,
"f_max": 190.05e12,
"type_def": "variable_gain",
"gain_flatmax": 26,
"gain_min": 15,
"p_max": 21,
"nf_min": 6,
"nf_max": 10,
"out_voa_auto": False,
"allowed_for_design": True},
{
"type_variety": "std_medium_gain_multiband",
"type_def": "multi_band",
"amplifiers": [
"std_medium_gain_C",
"std_medium_gain_L"
],
"allowed_for_design": False
}
]
equipment_json['Edfa'].extend(amps)
equipment = _equipment_from_json(equipment_json, extra_configs)
el_config = {
"uid": "Edfa1",
"type": "Multiband_amplifier",
"type_variety": "std_medium_gain_multiband",
"amplifiers": [
{
"type_variety": "std_medium_gain_C",
"operational": {
"gain_target": 22.55,
"delta_p": 0.9,
"out_voa": 3.0,
"tilt_target": 0.0,
}
},
{
"type_variety": "std_medium_gain_L",
"operational": {
"gain_target": 21,
"delta_p": 3.0,
"out_voa": 3.0,
"tilt_target": 0.0,
}
}
]
}
fused_config = {
"uid": "[83/WR-2-4-SIG=>930/WRT-1-2-SIG]-Tl/9300",
"type": "Fused",
"params": {
"loss": 20
}
}
json_data = {
"elements": [
el_config,
fused_config
],
"connections": []
}
network = network_from_json(json_data, equipment)
amp = next(n for n in network.nodes() if n.uid == 'Edfa1')
fused = next(n for n in network.nodes() if n.uid == '[83/WR-2-4-SIG=>930/WRT-1-2-SIG]-Tl/9300')
si = create_input_spectral_information(f_min=186e12, f_max=196e12, roll_off=0.15, baud_rate=32e9, tx_power=1e-3,
spacing=50e9, tx_osnr=40.0)
assert si.number_of_channels == 200
si = fused(si)
si = amp(si)
# assert nb of channel after mux/demux
assert si.number_of_channels == 164 # computed based on amp bands
# Check that multiband amp is correctly created with correct __str__
actual_c_amp = amp.amplifiers["CBAND"].__str__()
expected_c_amp = '\n'.join([
'Edfa Edfa1',
' type_variety: std_medium_gain_C',
' effective gain(dB): 21.22',
' (before att_in and before output VOA)',
' tilt-target(dB) 0.00',
' noise figure (dB): 6.32',
' (including att_in)',
' pad att_in (dB): 0.00',
' Power In (dBm): -0.22',
' Power Out (dBm): 21.01',
' Delta_P (dB): 0.90',
' target pch (dBm): None',
' actual pch out (dBm): -1.77',
' output VOA (dB): 3.00'])
assert actual_c_amp == expected_c_amp
actual_l_amp = amp.amplifiers["LBAND"].__str__()
expected_l_amp = '\n'.join([
'Edfa Edfa1',
' type_variety: std_medium_gain_L',
' effective gain(dB): 21.00',
' (before att_in and before output VOA)',
' tilt-target(dB) 0.00',
' noise figure (dB): 6.36',
' (including att_in)',
' pad att_in (dB): 0.00',
' Power In (dBm): -1.61',
' Power Out (dBm): 19.40',
' Delta_P (dB): 3.00',
' target pch (dBm): None',
' actual pch out (dBm): -1.99',
' output VOA (dB): 3.00'])
assert actual_l_amp == expected_l_amp
# check that f_min, f_max of si are within amp band
assert amp.amplifiers["LBAND"].params.f_min == 186.55e12
assert si.frequency[0] >= amp.amplifiers["LBAND"].params.f_min
assert amp.amplifiers["CBAND"].params.f_max == 196.15e12
assert si.frequency[-1] <= amp.amplifiers["CBAND"].params.f_max
for freq in si.frequency:
if freq > 190.05e12:
assert freq >= 191.25e12
if freq < 191.25e12:
assert freq <= 190.25e12
def test_user_defined_config():
"""Checks that a user defined config is correctly used instead of DEFAULT_EDFA_CONFIG
"""
extra_configs['user_edfa_config.json'] = DATA_DIR / 'user_edfa_config.json'
user_edfa = {
"type_variety": "user_defined",
"type_def": "variable_gain",
"gain_flatmax": 25,
"gain_min": 15,
"p_max": 21,
"nf_min": 6,
"nf_max": 10,
"default_config_from_json": "user_edfa_config.json",
"out_voa_auto": False,
"allowed_for_design": True
}
# add the reference to
json_data = load_json(eqpt_library)
json_data['Edfa'].append(user_edfa)
equipment = _equipment_from_json(json_data, extra_configs)
json_data = {
"elements": [{
"uid": "Edfa1",
"type": "Edfa",
"type_variety": "user_defined",
"operational": {
"delta_p": -3,
"gain_target": 20,
"tilt_target": 0,
"out_voa": 0
}
}],
"connections": []
}
network = network_from_json(json_data, equipment)
amp = [n for n in network.nodes()][0]
assert_allclose(amp.params.f_min, 193.0e12, rtol=1e-13)
assert_allclose(amp.params.f_max, 195.0e12, rtol=1e-13)
assert_allclose(amp.params.gain_ripple[15], 0.01027114740367, rtol=1e-13)
assert_allclose(amp.params.nf_ripple[15], 0.0, rtol=1e-13)
assert_allclose(amp.params.dgt[15], 1.847275503201129, rtol=1e-13)
def test_default_config():
"""Checks that a config using a file gives the exact same result as the default config if values are identical
to DEFAULT_EDFA_CONFIG
"""
extra_configs['copy_default_edfa_config.json'] = DATA_DIR / 'copy_default_edfa_config.json'
user_edfa = {
"type_variety": "user_defined",
"type_def": "variable_gain",
"gain_flatmax": 25,
"gain_min": 15,
"p_max": 21,
"nf_min": 6,
"nf_max": 10,
"default_config_from_json": "copy_default_edfa_config.json",
"out_voa_auto": False,
"allowed_for_design": True
}
default_edfa = {
"type_variety": "default",
"type_def": "variable_gain",
"gain_flatmax": 25,
"gain_min": 15,
"p_max": 21,
"nf_min": 6,
"nf_max": 10,
"out_voa_auto": False,
"allowed_for_design": True
}
# add the reference to
json_data = load_json(eqpt_library)
json_data['Edfa'].append(user_edfa)
json_data['Edfa'].append(default_edfa)
equipment = _equipment_from_json(json_data, extra_configs)
json_data = {
"elements": [{
"uid": "Edfa1",
"type": "Edfa",
"type_variety": "user_defined",
"operational": {
"delta_p": -3,
"gain_target": 20,
"tilt_target": 0,
"out_voa": 0
}
}, {
"uid": "Edfa2",
"type": "Edfa",
"type_variety": "default",
"operational": {
"delta_p": -3,
"gain_target": 20,
"tilt_target": 0,
"out_voa": 0
}
}],
"connections": []
}
network = network_from_json(json_data, equipment)
amp1, amp2 = [n for n in network.nodes()]
assert_allclose(amp1.params.f_min, amp2.params.f_min, rtol=1e-13)
assert_allclose(amp1.params.f_max, amp2.params.f_max, rtol=1e-13)
assert_allclose(amp1.params.gain_ripple, amp2.params.gain_ripple, rtol=1e-13)
assert_allclose(amp1.params.nf_ripple, amp2.params.nf_ripple, rtol=1e-13)
assert_allclose(amp1.params.dgt, amp2.params.dgt, rtol=1e-13)
@pytest.mark.parametrize("file", [None, {"name": "copy_default_edfa_config.json",
"path": DATA_DIR / "copy_default_edfa_config.json"}])
def test_frequency_range(file):
"""Checks that a frequency range is correctly read from the library and pre-empts DEFAULT_EDFA_CONFIG
"""
user_edfa = {
"type_variety": "user_defined",
"type_def": "variable_gain",
"f_min": 192.0e12,
"f_max": 195.9e12,
"gain_flatmax": 25,
"gain_min": 15,
"p_max": 21,
"nf_min": 6,
"nf_max": 10,
"out_voa_auto": False,
"allowed_for_design": True
}
if file:
user_edfa["default_config_from_json"] = file['name']
extra_configs[file['name']] = file['path']
# add the reference to
json_data = load_json(eqpt_library)
json_data['Edfa'].append(user_edfa)
equipment = _equipment_from_json(json_data, extra_configs)
json_data = {
"elements": [{
"uid": "Edfa1",
"type": "Edfa",
"type_variety": "user_defined",
"operational": {
"delta_p": -3,
"gain_target": 20,
"tilt_target": 0,
"out_voa": 0
}
}],
"connections": []
}
network = network_from_json(json_data, equipment)
amp = [n for n in network.nodes()][0]
si = create_input_spectral_information(f_min=191.3e12, f_max=196.05e12, roll_off=0.15, baud_rate=64e9,
spacing=75e9, tx_osnr=None, tx_power=1e-5)
si = amp(si)
assert_allclose(amp.params.f_min, 192.0e12, rtol=1e-13)
assert_allclose(amp.params.f_max, 195.9e12, rtol=1e-13)
assert si.frequency[0] >= 192.0e12 + 75e9 / 2
assert si.frequency[-1] <= 195.9e12 - 75e9 / 2

View File

@@ -14,25 +14,35 @@ checks that empty info on mode, power, nbchannel in service file are supported
"""
from pathlib import Path
from logging import INFO
from numpy.testing import assert_allclose
import pytest
from gnpy.core.network import build_network
from gnpy.core.utils import automatic_nch, lin2db
from gnpy.core.utils import automatic_nch, lin2db, watt2dbm
from gnpy.core.elements import Roadm
from gnpy.topology.request import compute_path_dsjctn, propagate, propagate_and_optimize_mode, correct_json_route_list
from gnpy.tools.json_io import load_network, load_equipment, requests_from_json, load_requests
from gnpy.tools.json_io import load_network, load_equipment, requests_from_json, load_requests, load_json, \
_equipment_from_json
network_file_name = Path(__file__).parent.parent / 'tests/data/testTopology_expected.json'
service_file_name = Path(__file__).parent.parent / 'tests/data/testTopology_testservices.json'
result_file_name = Path(__file__).parent.parent / 'tests/data/testTopology_testresults.json'
eqpt_library_name = Path(__file__).parent.parent / 'tests/data/eqpt_config.json'
data_dir = Path(__file__).parent.parent / 'tests/data'
network_file_name = data_dir / 'testTopology_expected.json'
service_file_name = data_dir / 'testTopology_testservices.json'
result_file_name = data_dir / 'testTopology_testresults.json'
eqpt_library_name = data_dir / 'eqpt_config.json'
extra_configs = {"std_medium_gain_advanced_config.json": data_dir / "std_medium_gain_advanced_config.json",
"Juniper-BoosterHG.json": data_dir / "Juniper-BoosterHG.json"}
@pytest.mark.parametrize("net", [network_file_name])
@pytest.mark.parametrize("eqpt", [eqpt_library_name])
@pytest.mark.parametrize("serv", [service_file_name])
@pytest.mark.parametrize("expected_mode", [['16QAM', 'PS_SP64_1', 'PS_SP64_1', 'PS_SP64_1', 'mode 2 - fake', 'mode 2', 'PS_SP64_1', 'mode 3', 'PS_SP64_1', 'PS_SP64_1', '16QAM', 'mode 1', 'PS_SP64_1', 'PS_SP64_1', 'mode 1', 'mode 2', 'mode 1', 'mode 2', 'nok']])
@pytest.mark.parametrize("expected_mode", [['16QAM', 'PS_SP64_1', 'PS_SP64_1', 'PS_SP64_1', 'mode 2 - fake', 'mode 2',
'PS_SP64_1', 'mode 3', 'PS_SP64_1', 'PS_SP64_1', '16QAM', 'mode 1',
'PS_SP64_1', 'PS_SP64_1', 'mode 1', 'mode 2', 'mode 1', 'mode 2', 'nok']])
def test_automaticmodefeature(net, eqpt, serv, expected_mode):
equipment = load_equipment(eqpt)
equipment = load_equipment(eqpt, extra_configs)
network = load_network(net, equipment)
data = load_requests(serv, eqpt, bidir=False, network=network, network_filename=net)
@@ -83,3 +93,89 @@ def test_automaticmodefeature(net, eqpt, serv, expected_mode):
path_res_list.append('nok')
print(path_res_list)
assert path_res_list == expected_mode
def test_propagate_and_optimize_mode(caplog):
"""Checks that the automatic mode returns the last explored mode
Mode are explored with descending baud_rate order and descending bitrate, so the last explored mode must be mode 1
Mode 1 GSNR is OK but pdl penalty are not OK due to high ROADM PDL. so the last explored mode is not OK
Then the propagate_and_optimize_mode must return mode 1 and the blocking reason must be 'NO_FEASIBLE_MODE'
"""
caplog.set_level(INFO)
json_data = load_json(eqpt_library_name)
voyager = next(e for e in json_data['Transceiver'] if e['type_variety'] == 'Voyager')
# expected path min GSNR is 22.11
# Change Voyager modes so that:
# - highest baud rate has min OSNR > path GSNR
# - lower baudrate with highest bitrate has min OSNR > path GSNR
# - lower baudrate with lower bitrate has has min OSNR < path GSNR but PDL penalty is infinite
voyager['mode'] = [
{
"format": "mode 1",
"baud_rate": 32e9,
"OSNR": 12,
"bit_rate": 100e9,
"roll_off": 0.15,
"tx_osnr": 45,
"min_spacing": 50e9,
"penalties": [
{
"chromatic_dispersion": 4e3,
"penalty_value": 0
}, {
"chromatic_dispersion": 40e3,
"penalty_value": 0
}, {
"pdl": 0.5,
"penalty_value": 1
}, {
"pmd": 30,
"penalty_value": 0
}],
"cost": 1
},
{
"format": "mode 3",
"baud_rate": 32e9,
"OSNR": 30,
"bit_rate": 300e9,
"roll_off": 0.15,
"tx_osnr": 45,
"min_spacing": 50e9,
"cost": 1
},
{
"format": "mode 2",
"baud_rate": 66e9,
"OSNR": 25,
"bit_rate": 400e9,
"roll_off": 0.15,
"tx_osnr": 45,
"min_spacing": 75e9,
"cost": 1
}]
# change default ROADM PDL so that crossing 2 ROADMs leasd to inifinte penalty for mode 1
eqpt_roadm = next(r for r in json_data['Roadm'] if 'type_variety' not in r)
eqpt_roadm['pdl'] = 0.5
equipment = _equipment_from_json(json_data, extra_configs)
network = load_network(network_file_name, equipment)
data = load_requests(filename=Path(__file__).parent.parent / 'tests/data/testTopology_services_expected.json',
eqpt=eqpt_library_name, bidir=False, network=network, network_filename=network_file_name)
# remove the mode from request, change it to larger spacing
data['path-request'][1]['path-constraints']['te-bandwidth']['trx_mode'] = None
data['path-request'][1]['path-constraints']['te-bandwidth']['spacing'] = 75e9
assert_allclose(watt2dbm(data['path-request'][1]['path-constraints']['te-bandwidth']['output-power']), 1, rtol=1e-9)
# use the request power for design, or there will be inconsistencies with the gain
build_network(network, equipment, 1, 21)
rqs = requests_from_json(data, equipment)
rqs = correct_json_route_list(network, rqs)
[path] = compute_path_dsjctn(network, equipment, [rqs[1]], [])
total_path, mode = propagate_and_optimize_mode(path, rqs[1], equipment)
assert round(min(path[-1].snr_01nm), 2) == 22.22
assert mode['format'] == 'mode 1'
assert rqs[1].blocking_reason == 'NO_FEASIBLE_MODE'
expected_mesg = '\tWarning! Request 1: no mode satisfies path SNR requirement.'
# Last log records mustcontain the message about the las explored mode
assert expected_mesg in caplog.records[-1].message

View File

@@ -23,10 +23,14 @@ from gnpy.topology.request import (compute_path_dsjctn, isdisjoint, find_reverse
from gnpy.topology.spectrum_assignment import build_oms_list
from gnpy.tools.json_io import requests_from_json, load_requests, load_network, load_equipment, disjunctions_from_json
NETWORK_FILE_NAME = Path(__file__).parent.parent / 'tests/data/testTopology_expected.json'
SERVICE_FILE_NAME = Path(__file__).parent.parent / 'tests/data/testTopology_testservices.json'
RESULT_FILE_NAME = Path(__file__).parent.parent / 'tests/data/testTopology_testresults.json'
EQPT_LIBRARY_NAME = Path(__file__).parent.parent / 'tests/data/eqpt_config.json'
DATA_DIR = Path(__file__).parent.parent / 'tests/data'
NETWORK_FILE_NAME = DATA_DIR / 'testTopology_expected.json'
SERVICE_FILE_NAME = DATA_DIR / 'testTopology_testservices.json'
RESULT_FILE_NAME = DATA_DIR / 'testTopology_testresults.json'
EQPT_LIBRARY_NAME = DATA_DIR / 'eqpt_config.json'
EXTRA_CONFIGS = {"std_medium_gain_advanced_config.json": DATA_DIR / "std_medium_gain_advanced_config.json",
"Juniper-BoosterHG.json": DATA_DIR / "Juniper-BoosterHG.json"}
@pytest.fixture()
@@ -43,7 +47,7 @@ def serv(test_setup):
@pytest.fixture()
def test_setup():
"""common setup for tests: builds network, equipment and oms only once"""
equipment = load_equipment(EQPT_LIBRARY_NAME)
equipment = load_equipment(EQPT_LIBRARY_NAME, EXTRA_CONFIGS)
network = load_network(NETWORK_FILE_NAME, equipment)
# Build the network once using the default power defined in SI in eqpt config
# power density : db2linp(ower_dbm': 0)/power_dbm': 0 * nb channels as defined by
@@ -119,8 +123,9 @@ def create_rq(equipment, srce, dest, bdir, node_list, loose_list, rqid='test_req
'nodes_list': node_list,
'loose_list': loose_list,
'path_bandwidth': 100.0e9,
'power': 1.0,
'effective_freq_slot': None,
'power': 1.0e-3,
'tx_power': 1.0e-3,
'effective_freq_slot': None
}
params['format'] = params['trx_mode']
trx_params = trx_mode_params(equipment, params['trx_type'], params['trx_mode'], True)
@@ -258,7 +263,8 @@ def request_set():
'f_min': 191.1e12,
'f_max': 196.3e12,
'nb_channel': None,
'power': 0,
'power': 1e-3,
'tx_power': 1e-3,
'path_bandwidth': 200e9}
@@ -295,7 +301,7 @@ def test_aggregation(ids, modes, req_n, req_m, disjunction, final_ids, final_ns,
if mode is not defined, requests must not be merged,
if requests are in a synchronization vector, they should not be merged
"""
equipment = load_equipment(EQPT_LIBRARY_NAME)
equipment = load_equipment(EQPT_LIBRARY_NAME, EXTRA_CONFIGS)
requests = []
for request_id, mode, req_n, req_m in zip(ids, modes, req_n, req_m):
params = request_set

View File

@@ -17,17 +17,22 @@ from copy import deepcopy
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, create_arbitrary_spectral_information, ReferenceCarrier
from gnpy.core.info import create_input_spectral_information, create_arbitrary_spectral_information, ReferenceCarrier, \
carriers_to_spectral_information
from gnpy.core.equipment import trx_mode_params
from gnpy.core.exceptions import ConfigurationError
from gnpy.tools.json_io import network_from_json, load_equipment, load_network, _spectrum_from_json, load_json, \
Transceiver, requests_from_json
from gnpy.topology.request import PathRequest, compute_constrained_path, propagate, propagate_and_optimize_mode
from gnpy.topology.spectrum_assignment import build_oms_list
TEST_DIR = Path(__file__).parent
EQPT_FILENAME = TEST_DIR / 'data/eqpt_config.json'
NETWORK_FILENAME = TEST_DIR / 'data/testTopology_expected.json'
DATA_DIR = TEST_DIR / 'data'
EQPT_FILENAME = DATA_DIR / 'eqpt_config.json'
NETWORK_FILENAME = DATA_DIR / 'testTopology_expected.json'
EXTRA_CONFIGS = {"std_medium_gain_advanced_config.json": DATA_DIR / "std_medium_gain_advanced_config.json",
"Juniper-BoosterHG.json": DATA_DIR / "Juniper-BoosterHG.json"}
@pytest.mark.parametrize('degree, equalization_type, target, expected_pch_out_dbm, expected_si',
@@ -54,6 +59,7 @@ def test_equalization_combination_degree(delta_pdb_per_channel, degree, equaliza
roadm_config = {
"uid": "roadm Lannion_CAS",
"type_variety": "default",
"params": {
"per_degree_pch_out_db": {
"east edfa in Lannion_CAS to Corlay": -16
@@ -68,10 +74,13 @@ def test_equalization_combination_degree(delta_pdb_per_channel, degree, equaliza
"restrictions": {
"preamp_variety_list": [],
"booster_variety_list": []
}
},
"roadm-path-impairments": [],
"design_bands": None
}
}
roadm = Roadm(**roadm_config)
roadm.set_roadm_paths(from_degree='tata', to_degree=degree, path_type='express')
roadm.ref_pch_in_dbm['tata'] = 0
roadm.ref_carrier = ReferenceCarrier(baud_rate=32e9, slot_width=50e9)
frequency = 191e12 + array([0, 50e9, 150e9, 225e9, 275e9])
@@ -85,6 +94,7 @@ def test_equalization_combination_degree(delta_pdb_per_channel, degree, equaliza
to_json_before_propagation = {
'uid': 'roadm Lannion_CAS',
'type': 'Roadm',
"type_variety": "default",
'params': {
equalization_type: target,
'restrictions': {'preamp_variety_list': [], 'booster_variety_list': []},
@@ -118,7 +128,8 @@ def test_wrong_element_config(equalization_type):
"restrictions": {
"preamp_variety_list": [],
"booster_variety_list": []
}
},
"design_bands": None
},
"metadata": {
"location": {
@@ -143,7 +154,7 @@ def test_merge_equalization():
"type": "Roadm"}],
"connections": []
}
equipment = load_equipment(EQPT_FILENAME)
equipment = load_equipment(EQPT_FILENAME, EXTRA_CONFIGS)
network = network_from_json(json_data, equipment)
roadm = [n for n in network.nodes()][0]
assert roadm.target_pch_out_dbm == -20
@@ -229,7 +240,9 @@ def test_low_input_power(target_out, delta_pdb_per_channel, correction):
"restrictions": {
"preamp_variety_list": [],
"booster_variety_list": []
}
},
"roadm-path-impairments": [],
"design_bands": None
},
"metadata": {
"location": {
@@ -241,6 +254,7 @@ def test_low_input_power(target_out, delta_pdb_per_channel, correction):
}
}
roadm = Roadm(**roadm_config)
roadm.set_roadm_paths(from_degree='tata', to_degree='toto', path_type='express')
roadm.ref_pch_in_dbm['tata'] = 0
roadm.ref_carrier = ReferenceCarrier(baud_rate=32e9, slot_width=50e9)
si = roadm(si, degree='toto', from_degree='tata')
@@ -281,7 +295,9 @@ def test_2low_input_power(target_out, delta_pdb_per_channel, correction):
"restrictions": {
"preamp_variety_list": [],
"booster_variety_list": []
}
},
"roadm-path-impairments": [],
"design_bands": None
},
"metadata": {
"location": {
@@ -293,6 +309,7 @@ def test_2low_input_power(target_out, delta_pdb_per_channel, correction):
}
}
roadm = Roadm(**roadm_config)
roadm.set_roadm_paths(from_degree='tata', to_degree='toto', path_type='express')
roadm.ref_pch_in_dbm['tata'] = 0
roadm.ref_carrier = ReferenceCarrier(baud_rate=32e9, slot_width=50e9)
si = roadm(si, degree='toto', from_degree='tata')
@@ -322,10 +339,11 @@ def create_voyager_req(equipment, source, dest, bidir, nodes_list, loose_list, m
'nodes_list': nodes_list,
'loose_list': loose_list,
'path_bandwidth': 100.0e9,
'effective_freq_slot': None}
'effective_freq_slot': None,
'power': 1e-3,
'tx_power': 1e-3}
trx_params = trx_mode_params(equipment, params['trx_type'], params['trx_mode'], True)
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'])
@@ -337,7 +355,7 @@ def create_voyager_req(equipment, source, dest, bidir, nodes_list, loose_list, m
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)
equipment = load_equipment(EQPT_FILENAME, EXTRA_CONFIGS)
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)
@@ -360,9 +378,9 @@ def test_initial_spectrum(mode, slot_width, power_dbm):
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_allclose(infos_expected.signal, infos_actual.signal, rtol=1e-10)
assert_allclose(infos_expected.nli, infos_actual.nli, rtol=1e-10)
assert_allclose(infos_expected.ase, infos_actual.ase, rtol=1e-10)
assert_array_equal(infos_expected.roll_off, infos_actual.roll_off)
assert_array_equal(infos_expected.chromatic_dispersion, infos_actual.chromatic_dispersion)
assert_array_equal(infos_expected.pmd, infos_actual.pmd)
@@ -374,7 +392,7 @@ 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)
equipment = load_equipment(EQPT_FILENAME, EXTRA_CONFIGS)
req = create_voyager_req(equipment, 'trx Brest_KLA', 'trx Vannes_KBE', False, ['trx Vannes_KBE'], ['STRICT'],
'mode 1', 50e9, 0)
network = net_setup(equipment)
@@ -409,7 +427,7 @@ 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)
equipment = load_equipment(EQPT_FILENAME, EXTRA_CONFIGS)
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)
@@ -437,7 +455,7 @@ def test_target_psd_or_psw(power_dbm, equalization, target_value):
def ref_network():
"""Create a network instance with a instance of propagated path"""
equipment = load_equipment(EQPT_FILENAME)
equipment = load_equipment(EQPT_FILENAME, EXTRA_CONFIGS)
network = net_setup(equipment)
req0 = create_voyager_req(equipment, 'trx Brest_KLA', 'trx Vannes_KBE', False, ['trx Vannes_KBE'], ['STRICT'],
'mode 1', 50e9, 0)
@@ -452,7 +470,7 @@ def test_target_psd_out_mwperghz_deltap(deltap):
Power over 1.18dBm saturate amp with this test: TODO add a test on this saturation
"""
equipment = load_equipment(EQPT_FILENAME)
equipment = load_equipment(EQPT_FILENAME, EXTRA_CONFIGS)
network = net_setup(equipment, deltap)
req = create_voyager_req(equipment, 'trx Brest_KLA', 'trx Vannes_KBE', False, ['trx Vannes_KBE'], ['STRICT'],
'mode 1', 50e9, deltap)
@@ -495,7 +513,7 @@ def test_equalization(case, deltap, target, mode, slot_width, equalization):
- per degree : target_pch_out_db / target_psd_out_mWperGHz
for these cases with and without power from user
"""
equipment = load_equipment(EQPT_FILENAME)
equipment = load_equipment(EQPT_FILENAME, EXTRA_CONFIGS)
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'],
@@ -531,8 +549,8 @@ def test_equalization(case, deltap, target, mode, slot_width, equalization):
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)
f_min=req.f_min, f_max=req.f_max, roll_off=req.roll_off, baud_rate=req.baud_rate,
spacing=req.spacing, tx_osnr=req.tx_osnr, tx_power=req.power)
for i, el in enumerate(path):
if isinstance(el, Roadm):
si = el(si, degree=path[i + 1].uid, from_degree=path[i - 1].uid)
@@ -552,7 +570,7 @@ def test_equalization(case, deltap, target, mode, slot_width, equalization):
def test_power_option(req_power):
"""check that --po option adds correctly power with spectral information
"""
equipment = load_equipment(EQPT_FILENAME)
equipment = load_equipment(EQPT_FILENAME, EXTRA_CONFIGS)
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)
@@ -575,9 +593,9 @@ def test_power_option(req_power):
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_allclose(infos_expected.signal, infos_actual.signal, rtol=1e-10)
assert_allclose(infos_expected.nli, infos_actual.nli, rtol=1e-10)
assert_allclose(infos_expected.ase, infos_actual.ase, rtol=1e-10)
assert_array_equal(infos_expected.roll_off, infos_actual.roll_off)
assert_array_equal(infos_expected.chromatic_dispersion, infos_actual.chromatic_dispersion)
assert_array_equal(infos_expected.pmd, infos_actual.pmd)
@@ -703,7 +721,7 @@ def test_power_offset_trx_equalization_psw(slot_width, value):
"""Check that the equalization with the offset is giving the same result as with reference slot_width
Check that larger slot width but no offset takes larger slot width for equalization
"""
equipment = load_equipment(EQPT_FILENAME)
equipment = load_equipment(EQPT_FILENAME, EXTRA_CONFIGS)
trx = transceiver(slot_width, value)
equipment['Transceiver'][trx['type_variety']] = Transceiver(**trx)
setattr(equipment['Roadm']['default'], 'target_pch_out_db', None)
@@ -736,7 +754,7 @@ def test_power_offset_trx_equalization_psw(slot_width, value):
def test_power_offset_trx_equalization_p(slot_width, value):
"""Check that the constant power equalization with the offset is applied
"""
equipment = load_equipment(EQPT_FILENAME)
equipment = load_equipment(EQPT_FILENAME, EXTRA_CONFIGS)
trx = transceiver(slot_width, value)
equipment['Transceiver'][trx['type_variety']] = Transceiver(**trx)
setattr(equipment['Roadm']['default'], 'target_pch_out_db', -20)
@@ -762,7 +780,7 @@ def test_power_offset_automatic_mode_selection(slot_width, value, equalization,
"""Check that the same result is obtained if the mode is user defined or if it is
automatically selected
"""
equipment = load_equipment(EQPT_FILENAME)
equipment = load_equipment(EQPT_FILENAME, EXTRA_CONFIGS)
trx = transceiver(slot_width, value)
equipment['Transceiver'][trx['type_variety']] = Transceiver(**trx)
setattr(equipment['Roadm']['default'], 'target_pch_out_db', None)
@@ -833,3 +851,103 @@ def test_power_offset_automatic_mode_selection(slot_width, value, equalization,
_, mode = propagate_and_optimize_mode(path, free_req, equipment)
assert mode['format'] == expected_mode
assert_allclose(path_expected[-1].snr_01nm, path[-1].snr_01nm, rtol=1e-5)
@pytest.mark.parametrize('tx_power_dbm', [-10, -8, 0, 10])
def test_tx_power(tx_power_dbm):
"""If carrier add power is below equalization target + ROADM add max loss, then equalizatio
can not be applied.
"""
json_data = load_json(NETWORK_FILENAME)
for el in json_data['elements']:
if el['uid'] == 'roadm Lannion_CAS':
el['type_variety'] = 'example_detailed_impairments'
equipment = load_equipment(EQPT_FILENAME, EXTRA_CONFIGS)
network = network_from_json(json_data, equipment)
default_spectrum = equipment['SI']['default']
p_db = default_spectrum.power_dbm
p_total_db = p_db + lin2db(automatic_nch(default_spectrum.f_min, default_spectrum.f_max, default_spectrum.spacing))
build_network(network, equipment, p_db, p_total_db)
build_oms_list(network, equipment)
expected_roadm_lannion = {
"uid": "roadm Lannion_CAS",
"type": "Roadm",
"type_variety": "example_detailed_impairments",
"params": {
"restrictions": {
"preamp_variety_list": [],
"booster_variety_list": []
},
'per_degree_pch_out_db': {'east edfa in Lannion_CAS to Corlay': -20,
'east edfa in Lannion_CAS to Morlaix': -20,
'east edfa in Lannion_CAS to Stbrieuc': -20},
"target_pch_out_db": -20
},
'metadata': {
'location': {
'city': 'Lannion_CAS',
'latitude': 2.0,
'longitude': 0.0,
'region': 'RLD'
}
}
}
roadm = next(n for n in network.nodes() if n.uid == 'roadm Lannion_CAS')
assert roadm.to_json == expected_roadm_lannion
spectrum = _spectrum_from_json([
{
"f_min": 191.35e12,
"f_max": 191.35e12,
"baud_rate": 32e9,
"slot_width": 50e9,
"power_dbm": 0,
"roll_off": 0.15,
"tx_osnr": 40
},
{
"f_min": 193.15e12,
"f_max": 193.15e12,
"baud_rate": 32e9,
"slot_width": 50e9,
"power_dbm": 0,
"roll_off": 0.15,
"tx_osnr": 40,
"tx_power_dbm": tx_power_dbm
},
{
"f_min": 193.2e12,
"f_max": 193.2e12,
"baud_rate": 32e9,
"slot_width": 50e9,
"power_dbm": 0,
"roll_off": 0.15,
"tx_osnr": 40}])
power = 1.0e-3
si = carriers_to_spectral_information(initial_spectrum=spectrum,
power=power)
si = roadm(si, "east edfa in Lannion_CAS to Corlay", "trx Lannion_CAS")
# Checks that if tx_power on add port is below min required power, its equalization target can not be met
add_max_loss = next(e for e in getattr(equipment['Roadm']['example_detailed_impairments'], 'roadm-path-impairments')
if 'roadm-add-path' in e)['roadm-add-path'][0]['roadm-maxloss']
min_required_add_power = -20 + add_max_loss
power_reduction = max(0, min_required_add_power - tx_power_dbm)
assert_allclose(si.signal, dbm2watt(array([-20, -20 - power_reduction, -20])), rtol=1e-5)
path = ['trx Lannion_CAS',
'roadm Lannion_CAS',
'east edfa in Lannion_CAS to Stbrieuc',
'fiber (Lannion_CAS → Stbrieuc)-F056',
'east edfa in Stbrieuc to Rennes_STA',
'fiber (Stbrieuc → Rennes_STA)-F057',
'west edfa in Rennes_STA to Stbrieuc',
'roadm Rennes_STA',
'trx Rennes_STA']
si = carriers_to_spectral_information(initial_spectrum=spectrum,
power=power)
for i, uid in enumerate(path):
node = next(n for n in network.nodes() if n.uid == uid)
if isinstance(node, Roadm):
si = node(si, path[i + 1], path[i - 1])
else:
si = node(si)
assert_allclose(watt2dbm(si.signal + si.ase + si.nli), array([-20, -20, -20]), rtol=1e-5)

View File

@@ -22,8 +22,11 @@ from gnpy.topology.request import PathRequest, compute_constrained_path, propaga
TEST_DIR = Path(__file__).parent
EQPT_FILENAME = TEST_DIR / 'data/eqpt_config.json'
NETWORK_FILENAME = TEST_DIR / 'data/perdegreemeshTopologyExampleV2_auto_design_expected.json'
DATA_DIR = TEST_DIR / 'data'
EQPT_FILENAME = DATA_DIR / 'eqpt_config.json'
NETWORK_FILENAME = DATA_DIR / 'perdegreemeshTopologyExampleV2_auto_design_expected.json'
EXTRA_CONFIGS = {"std_medium_gain_advanced_config.json": DATA_DIR / "std_medium_gain_advanced_config.json",
"Juniper-BoosterHG.json": DATA_DIR / "Juniper-BoosterHG.json"}
def net_setup(equipment):
@@ -53,7 +56,8 @@ def create_rq(equipment, srce, dest, bdir, nd_list, ls_list, mode, power_dbm):
'effective_freq_slot': None,
'path_bandwidth': 100000000000.0,
'spacing': 50e9 if mode == 'mode 1' else 75e9,
'power': dbm2watt(power_dbm)
'power': dbm2watt(power_dbm),
'tx_power': dbm2watt(power_dbm)
}
trx_params = trx_mode_params(equipment, params['trx_type'], params['trx_mode'], True)
params.update(trx_params)
@@ -70,7 +74,7 @@ def test_gain_mode(req_power, power_dbm):
in gain mode, whatever the value of equipment power_dbm or request power, the network is unchanged
and the propagation remains the same as for power mode and 0dBm
"""
equipment = load_equipment(EQPT_FILENAME)
equipment = load_equipment(EQPT_FILENAME, EXTRA_CONFIGS)
network = net_setup(equipment)
req = create_rq(equipment, 'trx Brest_KLA', 'trx Rennes_STA', False,
['Edfa0_roadm Brest_KLA', 'roadm Lannion_CAS', 'trx Rennes_STA'],

View File

@@ -12,7 +12,7 @@ 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)
tx_osnr=40.0, tx_power=[1, 1, 1])
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))
@@ -33,7 +33,7 @@ def test_create_arbitrary_spectral_information():
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)
tx_osnr=40.0, tx_power=array([1, 2, 3]))
assert_array_equal(si.signal, array([3, 2, 1]))
@@ -41,16 +41,16 @@ def test_create_arbitrary_spectral_information():
r'larger than the slot width for channels: \[1, 3\].'):
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)
tx_osnr=40.0, tx_power=1)
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)
tx_osnr=40.0, baud_rate=32e9, slot_width=50e9, tx_power=1)
with pytest.raises(SpectrumError, match='Spectrum required slot widths larger than the frequency spectral '
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)
tx_osnr=40.0, roll_off=0.1, tx_power=1)
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)
tx_osnr=40.0, tx_power=1)

View File

@@ -14,15 +14,15 @@ SRC_ROOT = Path(__file__).parent.parent
('transmission_main_example', None, transmission_main_example, []),
('transmission_saturated', 'logs_transmission_saturated', transmission_main_example,
['tests/data/testTopology_expected.json', 'lannion', 'lorient', '-e', 'tests/data/eqpt_config.json', '--pow', '3']),
('path_requests_run', 'logs_path_request', path_requests_run, ['-v']),
('path_requests_run', 'logs_path_request', path_requests_run, ['--redesign-per-request', '-v']),
('transmission_main_example__raman', None, transmission_main_example,
['gnpy/example-data/raman_edfa_example_network.json', '--sim', 'gnpy/example-data/sim_params.json', '--show-channels', ]),
('openroadm-v4-Stockholm-Gothenburg', None, transmission_main_example,
['-e', 'gnpy/example-data/eqpt_config_openroadm_ver4.json', 'gnpy/example-data/Sweden_OpenROADMv4_example_network.json', ]),
['gnpy/example-data/Sweden_OpenROADMv4_example_network.json', '-e', 'gnpy/example-data/eqpt_config_openroadm_ver4.json', ]),
('openroadm-v5-Stockholm-Gothenburg', None, transmission_main_example,
['-e', 'gnpy/example-data/eqpt_config_openroadm_ver5.json', 'gnpy/example-data/Sweden_OpenROADMv5_example_network.json', ]),
['gnpy/example-data/Sweden_OpenROADMv5_example_network.json', '-e', 'gnpy/example-data/eqpt_config_openroadm_ver5.json', ]),
('transmission_main_example_long', None, transmission_main_example,
['-e', 'tests/data/eqpt_config.json', 'tests/data/test_long_network.json']),
['tests/data/test_long_network.json', '-e', 'tests/data/eqpt_config.json']),
('spectrum1_transmission_main_example', None, transmission_main_example,
['--spectrum', 'gnpy/example-data/initial_spectrum1.json', 'gnpy/example-data/meshTopologyExampleV2.xls', ]),
('spectrum2_transmission_main_example', None, transmission_main_example,
@@ -32,11 +32,17 @@ SRC_ROOT = Path(__file__).parent.parent
('power_sweep_example', 'logs_power_sweep_example', transmission_main_example,
['tests/data/testTopology_expected.json', 'brest', 'rennes', '-e', 'tests/data/eqpt_config_sweep.json', '--pow', '3']),
('transmission_long_pow', None, transmission_main_example,
['-e', 'tests/data/eqpt_config.json', 'tests/data/test_long_network.json', '--spectrum', 'gnpy/example-data/initial_spectrum2.json']),
['tests/data/test_long_network.json', '-e', 'tests/data/eqpt_config.json', '--spectrum', 'gnpy/example-data/initial_spectrum2.json']),
('transmission_long_psd', None, transmission_main_example,
['-e', 'tests/data/eqpt_config_psd.json', 'tests/data/test_long_network.json', '--spectrum', 'gnpy/example-data/initial_spectrum2.json', ]),
['tests/data/test_long_network.json', '-e', 'tests/data/eqpt_config_psd.json', '--spectrum', 'gnpy/example-data/initial_spectrum2.json', ]),
('transmission_long_psw', None, transmission_main_example,
['-e', 'tests/data/eqpt_config_psw.json', 'tests/data/test_long_network.json', '--spectrum', 'gnpy/example-data/initial_spectrum2.json', ]),
['tests/data/test_long_network.json', '-e', 'tests/data/eqpt_config_psw.json', '--spectrum', 'gnpy/example-data/initial_spectrum2.json', ]),
('multiband_transmission', None, transmission_main_example,
['gnpy/example-data/multiband_example_network.json', 'Site_A', 'Site_D', '-e', 'gnpy/example-data/eqpt_config_multiband.json',
'--spectrum', 'gnpy/example-data/multiband_spectrum.json', '--show-channels']),
('path_requests_run_extra_equipment', 'logs_path_requests_run_extra_equipment', path_requests_run,
['gnpy/example-data/meshTopologyExampleV2.xls', 'gnpy/example-data/service_pluggable.json', '--extra-equipment', 'gnpy/example-data/extra_eqpt_config.json', 'tests/data/extra_eqpt_config.json',
'--extra-config', 'tests/data/user_edfa_config.json'])
))
def test_example_invocation(capfd, caplog, output, log, handler, args):
"""Make sure that our examples produce useful output"""

View File

@@ -16,7 +16,10 @@ from gnpy.tools.convert import xls_to_json_data
TEST_DIR = Path(__file__).parent
EQPT_FILENAME = TEST_DIR / 'data/eqpt_config.json'
MULTIBAND_EQPT_FILENAME = TEST_DIR / 'data/eqpt_config_multiband.json'
DATA_DIR = TEST_DIR / 'data'
EXTRA_CONFIGS = {"std_medium_gain_advanced_config.json": DATA_DIR / "std_medium_gain_advanced_config.json",
"Juniper-BoosterHG.json": DATA_DIR / "Juniper-BoosterHG.json"}
def test_jsonthing(caplog):
@@ -34,8 +37,8 @@ def test_jsonthing(caplog):
"sys_margins": 2
}
_ = SI(**json_data)
expected_msg = 'WARNING missing f_min attribute in eqpt_config.json[SI]\n ' \
+ 'default value is f_min = 191350000000000.0'
expected_msg = '\n\tWARNING missing f_min attribute in eqpt_config.json[SI]\n' \
+ '\tdefault value is f_min = 191350000000000.0'
assert expected_msg in caplog.text
@@ -96,7 +99,7 @@ def test_wrong_equipment(caplog, error, equipment, json_data, expected_msg):
def test_wrong_xls_service(xls_service_filename, xls_topo_filename, expected_msg):
"""
"""
equipment = load_equipment(EQPT_FILENAME)
equipment = load_equipment(EQPT_FILENAME, EXTRA_CONFIGS)
network = load_network(DATA_DIR / xls_topo_filename, equipment)
with pytest.raises(ServiceError, match=expected_msg):
_ = load_requests(DATA_DIR / xls_service_filename, equipment, False, network, DATA_DIR / xls_topo_filename)
@@ -181,7 +184,7 @@ def wrong_requests():
}]
},
'expected_msg': 'Equipment Config error in imposed_mode: '
+ 'Could not find transponder "test_offset" with mode "mode 3" in equipment library'
+ 'Could not find transponder "test_offset" in equipment library'
})
data.append({
'error': ServiceError,
@@ -292,7 +295,7 @@ def test_json_request(error, json_data, expected_msg):
"""
Check that a missing key is correctly raisong the logger
"""
equipment = load_equipment(EQPT_FILENAME)
equipment = load_equipment(EQPT_FILENAME, EXTRA_CONFIGS)
with pytest.raises(error, match=re.escape(expected_msg)):
_ = requests_from_json(json_data, equipment)
@@ -386,7 +389,7 @@ def test_json_network(error, json_data, expected_msg):
"""
Check that a missing key is correctly raisong the logger
"""
equipment = load_equipment(EQPT_FILENAME)
equipment = load_equipment(EQPT_FILENAME, EXTRA_CONFIGS)
with pytest.raises(error, match=re.escape(expected_msg)):
_ = network_from_json(json_data, equipment)
@@ -420,3 +423,167 @@ def test_log_wrong_xlsx(caplog, input_filename, expected_msg):
"""
_ = xls_to_json_data(input_filename)
assert expected_msg in caplog.text
def wrong_configs():
wrong_config = [[{
"uid": "Edfa1",
"type": "Edfa",
"type_variety": "std_medium_gain_multiband",
"operational": {
"gain_target": 21,
"delta_p": 3.0,
"out_voa": 3.0,
"in_voa": 0.0,
"tilt_target": 0.0,
"f_min": 186.2,
"f_max": 190.2
}},
ParametersError]
]
wrong_config.append([{
"uid": "[83/WR-2-4-SIG=>930/WRT-1-2-SIG]-PhysicalConn/2056",
"type": "Fiber",
"type_variety": "SSMF",
"params": {
"dispersion_per_frequency": {
"frequency": [
185.49234135667396e12,
186.05251641137855e12,
188.01312910284463e12,
189.99124726477024e12],
"value": [
1.60e-05,
1.67e-05,
1.7e-05,
1.8e-05]
},
"loss_coef": 2.85,
"length_units": "km",
"att_in": 0.0,
"con_in": 0.0,
"con_out": 0.0
}},
ParametersError
])
wrong_config.append([{
"uid": "east edfa in Lannion_CAS to Stbrieuc",
"metadata": {
"location": {
"city": "Lannion_CAS",
"region": "RLD",
"latitude": 2.0,
"longitude": 0.0
}
},
"type": "Multiband_amplifier",
"type_variety": "std_low_gain_multiband",
"amplifiers": [{
"type_variety": "std_low_gain",
"operational": {
"gain_target": 20.0,
"delta_p": 0,
"tilt_target": 0,
"out_voa": 0
}
}, {
"type_variety": "std_low_gain_L_ter",
"operational": {
"gain_target": 20.0,
"delta_p": 1,
"tilt_target": 0,
"out_voa": 1
}
}]},
ConfigurationError])
wrong_config.append([{
"uid": "east edfa in Lannion_CAS to Stbrieuc",
"metadata": {
"location": {
"city": "Lannion_CAS",
"region": "RLD",
"latitude": 2.0,
"longitude": 0.0
}
},
"type": "Edfa",
"type_variety": "std_low_gain_multiband",
"amplifiers": [{
"type_variety": "std_low_gain",
"operational": {
"gain_target": 20.0,
"delta_p": 0,
"tilt_target": 0,
"out_voa": 0
}
}, {
"type_variety": "std_low_gain_L",
"operational": {
"gain_target": 20.0,
"delta_p": 1,
"tilt_target": 0,
"out_voa": 1
}
}]},
ParametersError])
wrong_config.append([{
"uid": "east edfa in Lannion_CAS to Stbrieuc",
"metadata": {
"location": {
"city": "Lannion_CAS",
"region": "RLD",
"latitude": 2.0,
"longitude": 0.0
}
},
"type": "Multiband_amplifier",
"type_variety": "std_low_gain_multiband",
"amplifiers": [{
"type_variety": "std_low_gain",
"operational": {
"gain_target": 20.0,
"delta_p": 0,
"tilt_target": 0,
"out_voa": 0
}
}, {
"type_variety": "std_low_gain_L",
"operational": {
"gain_target": 20.0,
"delta_p": 1,
"tilt_target": 0,
"out_voa": 1
}
}, {
"type_variety": "std_low_gain",
"operational": {
"gain_target": 20.0,
"delta_p": 1,
"tilt_target": 0,
"out_voa": 1
}
}]},
ParametersError])
return wrong_config
@pytest.mark.parametrize('el_config, error_type', wrong_configs())
def test_wrong_multiband(el_config, error_type):
equipment = load_equipment(MULTIBAND_EQPT_FILENAME, EXTRA_CONFIGS)
fused_config = {
"uid": "[83/WR-2-4-SIG=>930/WRT-1-2-SIG]-Tl/9300",
"type": "Fused",
"params": {
"loss": 20
}
}
json_data = {
"elements": [
el_config,
fused_config
],
"connections": []
}
with pytest.raises(error_type):
_ = network_from_json(json_data, equipment)

View File

@@ -6,16 +6,24 @@
from pathlib import Path
import pytest
from gnpy.core.exceptions import NetworkTopologyError
from gnpy.core.network import span_loss, build_network
from gnpy.tools.json_io import load_equipment, load_network, network_from_json
from gnpy.core.utils import lin2db, automatic_nch
from gnpy.core.elements import Fiber, Edfa
from numpy.testing import assert_allclose
from gnpy.core.exceptions import NetworkTopologyError, ConfigurationError
from gnpy.core.network import span_loss, build_network, select_edfa, get_node_restrictions, \
estimate_srs_power_deviation, add_missing_elements_in_network, get_next_node
from gnpy.tools.json_io import load_equipment, load_network, network_from_json, load_json
from gnpy.core.utils import lin2db, automatic_nch, merge_amplifier_restrictions
from gnpy.core.elements import Fiber, Edfa, Roadm, Multiband_amplifier
from gnpy.core.parameters import SimParams, EdfaParams, MultiBandParams
TEST_DIR = Path(__file__).parent
EQPT_FILENAME = TEST_DIR / 'data/eqpt_config.json'
NETWORK_FILENAME = TEST_DIR / 'data/bugfixiteratortopo.json'
DATA_DIR = TEST_DIR / 'data'
EQPT_FILENAME = DATA_DIR / 'eqpt_config.json'
EQPT_MULTBAND_FILENAME = DATA_DIR / 'eqpt_config_multiband.json'
NETWORK_FILENAME = DATA_DIR / 'bugfixiteratortopo.json'
EXTRA_CONFIGS = {"std_medium_gain_advanced_config.json": DATA_DIR / "std_medium_gain_advanced_config.json",
"Juniper-BoosterHG.json": DATA_DIR / "Juniper-BoosterHG.json"}
@pytest.mark.parametrize("node, attenuation", [
@@ -47,7 +55,7 @@ NETWORK_FILENAME = TEST_DIR / 'data/bugfixiteratortopo.json'
['Site_B', 0],
])
def test_span_loss(node, attenuation):
equipment = load_equipment(EQPT_FILENAME)
equipment = load_equipment(EQPT_FILENAME, EXTRA_CONFIGS)
network = load_network(NETWORK_FILENAME, equipment)
for x in network.nodes():
if x.uid == node:
@@ -59,7 +67,7 @@ def test_span_loss(node, attenuation):
@pytest.mark.parametrize("node", ['fused4'])
def test_span_loss_unconnected(node):
'''Fused node that has no next and no previous nodes should be detected'''
equipment = load_equipment(EQPT_FILENAME)
equipment = load_equipment(EQPT_FILENAME, EXTRA_CONFIGS)
network = load_network(NETWORK_FILENAME, equipment)
x = next(x for x in network.nodes() if x.uid == node)
with pytest.raises(NetworkTopologyError):
@@ -159,7 +167,7 @@ def test_eol(typ, expected_loss):
}
]
}
equipment = load_equipment(EQPT_FILENAME)
equipment = load_equipment(EQPT_FILENAME, EXTRA_CONFIGS)
equipment['Span']['default'].EOL = 1
network = network_from_json(json_data, equipment)
p_db = equipment['SI']['default'].power_dbm
@@ -225,9 +233,10 @@ def test_design_non_amplified_link(elem1, elem2, expected_gain, expected_delta_p
}
]
}
equipment = load_equipment(EQPT_FILENAME)
equipment = load_equipment(EQPT_FILENAME, EXTRA_CONFIGS)
equipment['Span']['default'].power_mode = power_mode
equipment['SI']['default'].power_dbm = p_db
equipment['SI']['default'].tx_power_dbm = p_db
network = network_from_json(json_data, equipment)
edfa = next(a for a in network.nodes() if a.uid == 'edfa')
edfa.params.out_voa_auto = True
@@ -240,3 +249,506 @@ def test_design_non_amplified_link(elem1, elem2, expected_gain, expected_delta_p
assert amp.delta_p == expected_delta_p
# max power of std_low_gain is 21 dBm
assert amp.effective_gain == expected_gain
def network_base(case, site_type, length=50.0, amplifier_type='Multiband_amplifier'):
base_network = {
'elements': [
{
'uid': 'trx SITE1',
'type': 'Transceiver'
},
{
'uid': 'trx SITE2',
'type': 'Transceiver'
},
{
'uid': 'roadm SITE1',
'type': 'Roadm'
},
{
'uid': 'roadm SITE2',
'type': 'Roadm'
},
{
'uid': 'fiber (SITE1 → ILA1)',
'type': 'Fiber',
'type_variety': 'SSMF',
'params': {
'length': length,
'loss_coef': 0.2,
'length_units': 'km'
}
},
{
'uid': 'fiber (ILA1 → ILA2)',
'type': 'Fiber',
'type_variety': 'SSMF',
'params': {
'length': 50.0,
'loss_coef': 0.2,
'length_units': 'km'
}
},
{
'uid': 'fiber (ILA2 → SITE2)',
'type': 'Fiber',
'type_variety': 'SSMF',
'params': {
'length': 50.0,
'loss_coef': 0.2,
'length_units': 'km'
}
},
{
'uid': 'east edfa in SITE1 to ILA1',
'type': amplifier_type
},
{
'uid': 'east edfa or fused in ILA1',
'type': site_type
},
{
'uid': 'east edfa in ILA2',
'type': amplifier_type
}, {
'uid': 'west edfa in SITE2 to ILA1',
'type': amplifier_type
}
],
'connections': [
{
'from_node': 'trx SITE1',
'to_node': 'roadm SITE1'
},
{
'from_node': 'roadm SITE1',
'to_node': 'east edfa in SITE1 to ILA1'
},
{
'from_node': 'east edfa in SITE1 to ILA1',
'to_node': 'fiber (SITE1 → ILA1)'
},
{
'from_node': 'fiber (SITE1 → ILA1)',
'to_node': 'east edfa or fused in ILA1'
},
{
'from_node': 'east edfa or fused in ILA1',
'to_node': 'fiber (ILA1 → ILA2)'
},
{
'from_node': 'fiber (ILA1 → ILA2)',
'to_node': 'east edfa in ILA2'
},
{
'from_node': 'east edfa in ILA2',
'to_node': 'fiber (ILA2 → SITE2)'
},
{
'from_node': 'fiber (ILA2 → SITE2)',
'to_node': 'west edfa in SITE2 to ILA1'
},
{
'from_node': 'west edfa in SITE2 to ILA1',
'to_node': 'roadm SITE2'
},
{
'from_node': 'roadm SITE2',
'to_node': 'trx SITE2'
}
]
}
multiband_amps = [e for e in base_network['elements'] if e['type'] == 'Multiband_amplifier']
edfa2 = next(e for e in base_network['elements'] if e['uid'] == 'east edfa in ILA2')
roadm1 = next(e for e in base_network['elements'] if e['uid'] == 'roadm SITE1')
fused = [e for e in base_network['elements'] if e['type'] == 'Fused']
if case == 'monoband_no_design_band':
pass
elif case == 'monoband_roadm':
roadm1['params'] = {
'design_bands': [
{'f_min': 192.3e12, 'f_max': 196.0e12}
]
}
elif case == 'monoband_per_degree':
roadm1['params'] = {
'per_degree_design_bands': {
'east edfa in SITE1 to ILA1': [
{'f_min': 191.5e12, 'f_max': 195.0e12}
]
}
}
elif case == 'monoband_design':
edfa2['type_variety'] = 'std_medium_gain'
elif case == 'design':
for elem in multiband_amps:
elem['type_variety'] = 'std_medium_gain_multiband'
elem['amplifiers'] = [{
'type_variety': 'std_medium_gain',
'operational': {
'delta_p': 0,
'tilt_target': 0
}
}, {
'type_variety': 'std_medium_gain_L',
'operational': {
'delta_p': -1,
'tilt_target': 0
}
}]
for elem in fused:
elem['params'] = {'loss': 0.0}
elif case == 'no_design':
# user must indicate the bands otherwise SI band (single band is assumed) and this is not
# consistent with multiband amps.
roadm1['params'] = {
'per_degree_design_bands': {
'east edfa in SITE1 to ILA1': [
{'f_min': 191.3e12, 'f_max': 196.0e12},
{'f_min': 187.0e12, 'f_max': 190.0e12}
]
}
}
elif case == 'type_variety':
# bands are implicit based on amplifiers type_varieties
for elem in multiband_amps:
elem['type_variety'] = 'std_medium_gain_multiband'
return base_network
@pytest.mark.parametrize('case, site_type, amplifier_type, expected_design_bands, expected_per_degree_design_bands', [
('monoband_no_design_band', 'Edfa', 'Edfa',
[{'f_min': 191.3e12, 'f_max': 196.1e12}], [{'f_min': 191.3e12, 'f_max': 196.1e12}]),
('monoband_roadm', 'Edfa', 'Edfa',
[{'f_min': 192.3e12, 'f_max': 196.0e12}], [{'f_min': 192.3e12, 'f_max': 196.0e12}]),
('monoband_per_degree', 'Edfa', 'Edfa',
[{'f_min': 191.3e12, 'f_max': 196.1e12}], [{'f_min': 191.5e12, 'f_max': 195.0e12}]),
('monoband_design', 'Edfa', 'Edfa',
[{'f_min': 191.3e12, 'f_max': 196.1e12}], [{'f_min': 191.3e12, 'f_max': 196.1e12}]),
('design', 'Fused', 'Multiband_amplifier',
[{'f_min': 191.3e12, 'f_max': 196.1e12}],
[{'f_min': 186.55e12, 'f_max': 190.05e12}, {'f_min': 191.25e12, 'f_max': 196.15e12}]),
('no_design', 'Fused', 'Multiband_amplifier',
[{'f_min': 191.3e12, 'f_max': 196.1e12}],
[{'f_min': 187.0e12, 'f_max': 190.0e12}, {'f_min': 191.3e12, 'f_max': 196.0e12}])])
def test_design_band(case, site_type, amplifier_type, expected_design_bands, expected_per_degree_design_bands):
"""Check design_band is the one defined:
- in SI if nothing is defined,
- in ROADM if no design_band is defined for degree
- in per_degree
- if no design is defined,
- if type variety is defined: use it for determining bands
- if no type_variety autodesign is as expected, design uses OMS defined set of bands
EOL is added only once on spans. One span can be one fiber or several fused fibers
EOL is then added on the first fiber only.
"""
json_data = network_base(case, site_type, amplifier_type=amplifier_type)
equipment = load_equipment(EQPT_MULTBAND_FILENAME, EXTRA_CONFIGS)
network = network_from_json(json_data, equipment)
p_db = equipment['SI']['default'].power_dbm
p_total_db = p_db + lin2db(automatic_nch(equipment['SI']['default'].f_min,
equipment['SI']['default'].f_max, equipment['SI']['default'].spacing))
build_network(network, equipment, p_db, p_total_db)
roadm1 = next(n for n in network.nodes() if n.uid == 'roadm SITE1')
assert roadm1.design_bands == expected_design_bands
assert roadm1.per_degree_design_bands['east edfa in SITE1 to ILA1'] == expected_per_degree_design_bands
@pytest.mark.parametrize('raman_allowed, gain_target, power_target, target_extended_gain, warning, expected_selection', [
(False, 20, 20, 3, False, ('test_fixed_gain', 0)),
(False, 20, 25, 3, False, ('test_fixed_gain', -4)),
(False, 10, 15, 3, False, ('std_low_gain_bis', 0)),
(False, 5, 15, 3, "is below all available amplifiers min gain", ('std_low_gain_bis', 0)),
(False, 30, 15, 3, "is beyond all available amplifiers capabilities", ('std_medium_gain', -1)),
])
def test_select_edfa(caplog, raman_allowed, gain_target, power_target, target_extended_gain, warning, expected_selection):
"""
"""
equipment = load_equipment(EQPT_MULTBAND_FILENAME, EXTRA_CONFIGS)
edfa_eqpt = {n: a for n, a in equipment['Edfa'].items() if a.type_def != 'multi_band'}
selection = select_edfa(raman_allowed, gain_target, power_target, edfa_eqpt, "toto", target_extended_gain, verbose=True)
assert selection == expected_selection
if warning:
assert warning in caplog.text
@pytest.mark.parametrize('cls, defaultparams, variety_list, booster_list, band, expected_restrictions', [
(Edfa, EdfaParams, [], [],
{'LBAND': {'f_min': 187.0e12, 'f_max': 190.0e12}},
['std_medium_gain_L', 'std_low_gain_L_ter', 'std_low_gain_L']),
(Edfa, EdfaParams, [], [],
{'CBAND': {'f_min': 191.3e12, 'f_max': 196.0e12}},
['CienaDB_medium_gain', 'std_medium_gain', 'std_low_gain', 'std_low_gain_bis', 'test', 'test_fixed_gain']),
(Edfa, EdfaParams, ['std_medium_gain', 'std_high_gain'], [],
{'CBAND': {'f_min': 191.3e12, 'f_max': 196.0e12}},
['std_medium_gain']), # name in variety list does not exist in library
(Edfa, EdfaParams, ['std_medium_gain', 'std_high_gain'], [],
{'LBAND': {'f_min': 187.0e12, 'f_max': 190.0e12}},
[]), # restrictions inconsistency with bands
(Edfa, EdfaParams, ['std_medium_gain', 'std_high_gain'], ['std_booster'],
{'CBAND': {'f_min': 191.3e12, 'f_max': 196.0e12}},
['std_medium_gain']), # variety list takes precedence over booster constraint
(Edfa, EdfaParams, [], ['std_booster'],
{'CBAND': {'f_min': 191.3e12, 'f_max': 196.0e12}},
['std_booster']),
(Multiband_amplifier, MultiBandParams, [], [],
{'CBAND': {'f_min': 191.3e12, 'f_max': 196.0e12}, 'LBAND': {'f_min': 187.0e12, 'f_max': 190.0e12}},
['std_medium_gain_multiband', 'std_low_gain_multiband_bis']),
(Multiband_amplifier, MultiBandParams, [], ['std_booster_multiband', 'std_booster'],
{'CBAND': {'f_min': 191.3e12, 'f_max': 196.0e12}, 'LBAND': {'f_min': 187.0e12, 'f_max': 190.0e12}},
['std_booster_multiband'])
])
def test_get_node_restrictions(cls, defaultparams, variety_list, booster_list, band, expected_restrictions):
"""Check that all combinations of restrictions are correctly captured
"""
equipment = load_equipment(EQPT_MULTBAND_FILENAME, EXTRA_CONFIGS)
edfa_config = {"uid": "Edfa1"}
if cls == Multiband_amplifier:
edfa_config['amplifiers'] = {}
edfa_config['params'] = defaultparams.default_values
edfa_config['variety_list'] = variety_list
node = cls(**edfa_config)
roadm_config = {
"uid": "roadm Brest_KLA",
"params": {
"per_degree_pch_out_db": {},
"target_pch_out_dbm": -18,
"add_drop_osnr": 38,
"pmd": 0,
"pdl": 0,
"restrictions": {
"preamp_variety_list": [],
"booster_variety_list": booster_list
},
"roadm-path-impairments": []
},
"metadata": {
"location": {
"city": "Brest_KLA",
"region": "RLD",
"latitude": 4.0,
"longitude": 0.0
}
}
}
prev_node = Roadm(**roadm_config)
fiber_config = {
"uid": "fiber (SITE1 → ILA1)",
"type_variety": "SSMF",
"params": {
"length": 100.0,
"loss_coef": 0.2,
"length_units": "km"
}
}
extra_params = equipment['Fiber']['SSMF'].__dict__
fiber_config['params'] = merge_amplifier_restrictions(fiber_config['params'], extra_params)
next_node = Fiber(**fiber_config)
restrictions = get_node_restrictions(node, prev_node, next_node, equipment, band)
assert restrictions == expected_restrictions
@pytest.mark.usefixtures('set_sim_params')
@pytest.mark.parametrize('case, site_type, band, expected_gain, expected_tilt, expected_variety, sim_params', [
('design', 'Multiband_amplifier', 'LBAND', 10.0, 0.0, 'std_medium_gain_multiband', False),
('no_design', 'Multiband_amplifier', 'LBAND', 10.0, 0.0, 'std_low_gain_multiband_bis', False),
('type_variety', 'Multiband_amplifier', 'LBAND', 10.0, 0.0, 'std_medium_gain_multiband', False),
('design', 'Multiband_amplifier', 'LBAND', 9.344985, 0.0, 'std_medium_gain_multiband', True),
('no_design', 'Multiband_amplifier', 'LBAND', 9.344985, -0.938676, 'std_low_gain_multiband_bis', True),
('no_design', 'Multiband_amplifier', 'CBAND', 10.977065, -1.600193, 'std_low_gain_multiband_bis', True),
('no_design', 'Fused', 'LBAND', 21.0, 0.0, 'std_medium_gain_multiband', False),
('no_design', 'Fused', 'LBAND', 20.344985, -0.819176, 'std_medium_gain_multiband', True),
('no_design', 'Fused', 'CBAND', 21.770319, -1.40032, 'std_medium_gain_multiband', True),
('design', 'Fused', 'CBAND', 21.21108, 0.0, 'std_medium_gain_multiband', True),
('design', 'Multiband_amplifier', 'CBAND', 11.041037, 0.0, 'std_medium_gain_multiband', True)])
def test_multiband(case, site_type, band, expected_gain, expected_tilt, expected_variety, sim_params):
"""Check:
- if amplifiers are defined in multiband they are used for design,
- if no design is defined,
- if type variety is defined: use it for determining bands
- if no type_variety autodesign is as expected, design uses OMS defined set of bands
EOL is added only once on spans. One span can be one fiber or several fused fibers
EOL is then added on the first fiber only.
"""
json_data = network_base(case, site_type)
equipment = load_equipment(EQPT_MULTBAND_FILENAME, EXTRA_CONFIGS)
network = network_from_json(json_data, equipment)
p_db = equipment['SI']['default'].power_dbm
p_total_db = p_db + lin2db(automatic_nch(equipment['SI']['default'].f_min,
equipment['SI']['default'].f_max, equipment['SI']['default'].spacing))
if sim_params:
SimParams.set_params(load_json(TEST_DIR / 'data' / 'sim_params.json'))
build_network(network, equipment, p_db, p_total_db)
amp2 = next(n for n in network.nodes() if n.uid == 'east edfa in ILA2')
# restore simParams
save_sim_params = {"raman_params": SimParams._shared_dict['raman_params'].to_json(),
"nli_params": SimParams._shared_dict['nli_params'].to_json()}
SimParams.set_params(save_sim_params)
print(amp2.to_json)
assert_allclose(amp2.amplifiers[band].effective_gain, expected_gain, atol=1e-5)
assert_allclose(amp2.amplifiers[band].tilt_target, expected_tilt, atol=1e-5)
assert amp2.type_variety == expected_variety
def test_tilt_fused():
"""check that computed tilt is the same for one span 100km as 2 spans 30 +70 km
"""
design_bands = {'CBAND': {'f_min': 191.3e12, 'f_max': 196.0e12},
'LBAND': {'f_min': 187.0e12, 'f_max': 190.0e12}}
save_sim_params = {"raman_params": SimParams._shared_dict['raman_params'].to_json(),
"nli_params": SimParams._shared_dict['nli_params'].to_json()}
SimParams.set_params(load_json(TEST_DIR / 'data' / 'sim_params.json'))
input_powers = {'CBAND': 0.001, 'LBAND': 0.001}
json_data = network_base("design", "Multiband_amplifier", length=100)
equipment = load_equipment(EQPT_MULTBAND_FILENAME, EXTRA_CONFIGS)
network = network_from_json(json_data, equipment)
node = next(n for n in network.nodes() if n.uid == 'fiber (SITE1 → ILA1)')
tilt_db, tilt_target = estimate_srs_power_deviation(network, node, equipment, design_bands, input_powers)
json_data = network_base("design", "Fused", length=50)
equipment = load_equipment(EQPT_MULTBAND_FILENAME, EXTRA_CONFIGS)
network = network_from_json(json_data, equipment)
node = next(n for n in network.nodes() if n.uid == 'fiber (ILA1 → ILA2)')
fused_tilt_db, fused_tilt_target = \
estimate_srs_power_deviation(network, node, equipment, design_bands, input_powers)
# restore simParams
SimParams.set_params(save_sim_params)
for key in tilt_db:
assert_allclose(tilt_db[key], fused_tilt_db[key], rtol=1e-3)
for key in tilt_target:
assert_allclose(tilt_target[key], fused_tilt_target[key], rtol=1e-3)
def network_wo_booster(site_type, bands):
return {
'elements': [
{
'uid': 'trx SITE1',
'type': 'Transceiver'
},
{
'uid': 'trx SITE2',
'type': 'Transceiver'
},
{
'uid': 'roadm SITE1',
'params': {
'design_bands': bands
},
'type': 'Roadm'
},
{
'uid': 'roadm SITE2',
'type': 'Roadm'
},
{
'uid': 'fiber (SITE1 → ILA1)',
'type': 'Fiber',
'type_variety': 'SSMF',
'params': {
'length': 50.0,
'loss_coef': 0.2,
'length_units': 'km'
}
},
{
'uid': 'fiber (ILA1 → ILA2)',
'type': 'Fiber',
'type_variety': 'SSMF',
'params': {
'length': 50.0,
'loss_coef': 0.2,
'length_units': 'km'
}
},
{
'uid': 'fiber (ILA2 → SITE2)',
'type': 'Fiber',
'type_variety': 'SSMF',
'params': {
'length': 50.0,
'loss_coef': 0.2,
'length_units': 'km'
}
},
{
'uid': 'east edfa or fused in ILA1',
'type': site_type
}
],
'connections': [
{
'from_node': 'trx SITE1',
'to_node': 'roadm SITE1'
},
{
'from_node': 'roadm SITE1',
'to_node': 'fiber (SITE1 → ILA1)'
},
{
'from_node': 'fiber (SITE1 → ILA1)',
'to_node': 'east edfa or fused in ILA1'
},
{
'from_node': 'east edfa or fused in ILA1',
'to_node': 'fiber (ILA1 → ILA2)'
},
{
'from_node': 'fiber (ILA1 → ILA2)',
'to_node': 'fiber (ILA2 → SITE2)'
},
{
'from_node': 'fiber (ILA2 → SITE2)',
'to_node': 'roadm SITE2'
},
{
'from_node': 'roadm SITE2',
'to_node': 'trx SITE2'
}
]
}
@pytest.mark.parametrize('site_type, expected_type, bands, expected_bands', [
('Multiband_amplifier', Multiband_amplifier,
[{'f_min': 187.0e12, 'f_max': 190.0e12}, {'f_min': 191.3e12, 'f_max': 196.0e12}],
[{'f_min': 187.0e12, 'f_max': 190.0e12}, {'f_min': 191.3e12, 'f_max': 196.0e12}]),
('Edfa', Edfa,
[{'f_min': 191.4e12, 'f_max': 196.1e12}],
[{'f_min': 191.4e12, 'f_max': 196.1e12}]),
('Edfa', Edfa,
[{'f_min': 191.2e12, 'f_max': 196.0e12}],
[]),
('Fused', Multiband_amplifier,
[{'f_min': 187.0e12, 'f_max': 190.0e12}, {'f_min': 191.3e12, 'f_max': 196.0e12}],
[{'f_min': 187.0e12, 'f_max': 190.0e12}, {'f_min': 191.3e12, 'f_max': 196.0e12}]),
('Fused', Edfa,
[{'f_min': 191.3e12, 'f_max': 196.0e12}],
[{'f_min': 191.3e12, 'f_max': 196.0e12}])])
def test_insert_amp(site_type, expected_type, bands, expected_bands):
"""Check:
- if amplifiers are defined in multiband they are used for design,
- if no design is defined,
- if type variety is defined: use it for determining bands
- if no type_variety autodesign is as expected, design uses OMS defined set of bands
EOL is added only once on spans. One span can be one fiber or several fused fibers
EOL is then added on the first fiber only.
"""
json_data = network_wo_booster(site_type, bands)
equipment = load_equipment(EQPT_MULTBAND_FILENAME, EXTRA_CONFIGS)
network = network_from_json(json_data, equipment)
p_db = equipment['SI']['default'].power_dbm
p_total_db = p_db + lin2db(automatic_nch(equipment['SI']['default'].f_min,
equipment['SI']['default'].f_max, equipment['SI']['default'].spacing))
add_missing_elements_in_network(network, equipment)
if not expected_bands:
with pytest.raises(ConfigurationError):
build_network(network, equipment, p_db, p_total_db)
else:
build_network(network, equipment, p_db, p_total_db)
roadm1 = next(n for n in network.nodes() if n.uid == 'roadm SITE1')
amp1 = get_next_node(roadm1, network)
assert isinstance(amp1, expected_type)
assert roadm1.per_degree_design_bands['Edfa_booster_roadm SITE1_to_fiber (SITE1 → ILA1)'] == expected_bands

View File

@@ -40,17 +40,18 @@ def test_fiber_parameters():
fiber_dict_cr.update(Fiber(**fiber_dict_cr).__dict__)
fiber_params_cr = FiberParams(**fiber_dict_cr)
raman_coefficient_explicit_g0 = fiber_params_explicit_g0.raman_coefficient
raman_coefficient_explicit_g0 =\
raman_coefficient_explicit_g0.normalized_gamma_raman * fiber_params_explicit_g0._raman_reference_frequency
norm_gamma_raman_explicit_g0 = fiber_params_explicit_g0.raman_coefficient.normalized_gamma_raman
norm_gamma_raman_default_g0 = fiber_params_default_g0.raman_coefficient.normalized_gamma_raman
raman_coefficient_default_g0 = fiber_params_default_g0.raman_coefficient
raman_coefficient_default_g0 = \
raman_coefficient_default_g0.normalized_gamma_raman * fiber_params_default_g0._raman_reference_frequency
norm_gamma_raman_cr = fiber_params_cr.raman_coefficient.normalized_gamma_raman
raman_coefficient_cr = fiber_params_cr.raman_coefficient
raman_coefficient_cr = \
raman_coefficient_cr.normalized_gamma_raman * fiber_params_cr._raman_reference_frequency
assert_allclose(norm_gamma_raman_explicit_g0, norm_gamma_raman_default_g0, rtol=1e-10)
assert_allclose(norm_gamma_raman_explicit_g0, norm_gamma_raman_cr, rtol=1e-10)
assert_allclose(raman_coefficient_explicit_g0, raman_coefficient_default_g0, rtol=1e-10)
assert_allclose(raman_coefficient_explicit_g0, raman_coefficient_cr, rtol=1e-10)
# Change Effective Area
fiber_dict_default_g0['effective_area'] = 100e-12
no_ssmf_fiber_params = FiberParams(**fiber_dict_default_g0)
norm_gamma_raman_default_g0_no_ssmf = no_ssmf_fiber_params.raman_coefficient.normalized_gamma_raman
assert_allclose(norm_gamma_raman_explicit_g0, norm_gamma_raman_default_g0_no_ssmf, rtol=1e-10)

View File

@@ -25,19 +25,21 @@ import pytest
from copy import deepcopy
from gnpy.core.utils import automatic_nch, lin2db
from gnpy.core.network import build_network, add_missing_elements_in_network
from gnpy.core.exceptions import ServiceError
from gnpy.core.exceptions import ServiceError, ConfigurationError
from gnpy.topology.request import (jsontocsv, requests_aggregation, compute_path_dsjctn, deduplicate_disjunctions,
compute_path_with_disjunction, ResultElement, PathRequest)
from gnpy.topology.spectrum_assignment import build_oms_list, pth_assign_spectrum
from gnpy.tools.convert import convert_file
from gnpy.tools.json_io import (load_json, load_network, save_network, load_equipment, requests_from_json,
disjunctions_from_json, network_to_json, network_from_json)
from gnpy.tools.service_sheet import read_service_sheet, correct_xls_route_list
from gnpy.tools.service_sheet import read_service_sheet, correct_xls_route_list, Request_element, Request
TEST_DIR = Path(__file__).parent
DATA_DIR = TEST_DIR / 'data'
eqpt_filename = DATA_DIR / 'eqpt_config.json'
equipment = load_equipment(eqpt_filename)
EQPT_FILENAME = DATA_DIR / 'eqpt_config.json'
EXTRA_CONFIGS = {"std_medium_gain_advanced_config.json": DATA_DIR / "std_medium_gain_advanced_config.json",
"Juniper-BoosterHG.json": DATA_DIR / "Juniper-BoosterHG.json"}
equipment = load_equipment(EQPT_FILENAME, EXTRA_CONFIGS)
@pytest.mark.parametrize('xls_input,expected_json_output', {
@@ -69,7 +71,7 @@ def test_excel_json_generation(tmpdir, xls_input, expected_json_output):
}.items())
def test_auto_design_generation_fromxlsgainmode(tmpdir, xls_input, expected_json_output):
"""tests generation of topology json and that the build network gives correct results in gain mode"""
equipment = load_equipment(eqpt_filename)
equipment = load_equipment(EQPT_FILENAME, EXTRA_CONFIGS)
network = load_network(xls_input, equipment)
add_missing_elements_in_network(network, equipment)
# in order to test the Eqpt sheet and load gain target,
@@ -100,7 +102,7 @@ def test_auto_design_generation_fromxlsgainmode(tmpdir, xls_input, expected_json
}.items())
def test_auto_design_generation_fromjson(tmpdir, json_input, power_mode):
"""test that autodesign creates same file as an input file already autodesigned"""
equipment = load_equipment(eqpt_filename)
equipment = load_equipment(EQPT_FILENAME, EXTRA_CONFIGS)
network = load_network(json_input, equipment)
# in order to test the Eqpt sheet and load gain target,
# change the power-mode to False (to be in gain mode)
@@ -127,7 +129,7 @@ def test_auto_design_generation_fromjson(tmpdir, json_input, power_mode):
}.items())
def test_excel_service_json_generation(xls_input, expected_json_output):
"""test services creation"""
equipment = load_equipment(eqpt_filename)
equipment = load_equipment(EQPT_FILENAME, EXTRA_CONFIGS)
network = load_network(DATA_DIR / 'testTopology.xls', equipment)
# Build the network once using the default power defined in SI in eqpt config
p_db = equipment['SI']['default'].power_dbm
@@ -148,7 +150,7 @@ def test_excel_service_json_generation(xls_input, expected_json_output):
def test_csv_response_generation(tmpdir, json_input):
"""tests if generated csv is consistant with expected generation same columns (order not important)"""
json_data = load_json(json_input)
equipment = load_equipment(eqpt_filename)
equipment = load_equipment(EQPT_FILENAME, EXTRA_CONFIGS)
csv_filename = Path(tmpdir / json_input.name).with_suffix('.csv')
with open(csv_filename, 'w', encoding='utf-8') as fcsv:
jsontocsv(json_data, equipment, fcsv)
@@ -213,7 +215,7 @@ def test_csv_response_generation(tmpdir, json_input):
def test_json_response_generation(xls_input, expected_response_file):
"""tests if json response is correctly generated for all combinations of requests"""
equipment = load_equipment(eqpt_filename)
equipment = load_equipment(EQPT_FILENAME, EXTRA_CONFIGS)
network = load_network(xls_input, equipment)
p_db = equipment['SI']['default'].power_dbm
@@ -232,7 +234,7 @@ def test_json_response_generation(xls_input, expected_response_file):
rqs, dsjn = requests_aggregation(rqs, dsjn)
pths = compute_path_dsjctn(network, equipment, rqs, dsjn)
propagatedpths, reversed_pths, reversed_propagatedpths = \
compute_path_with_disjunction(network, equipment, rqs, pths)
compute_path_with_disjunction(network, equipment, rqs, pths, redesign=True)
pth_assign_spectrum(pths, rqs, oms_list, reversed_pths)
result = []
@@ -274,54 +276,45 @@ def test_json_response_generation(xls_input, expected_response_file):
else:
assert expected['response'][i] == response
# test the correspondance names dict in case of excel input
# test that using the created json network still works with excel input
# test all configurations of names: trx names, roadm, fused, ila and fiber
# as well as splitted case
# initial network is based on the couple testTopology.xls/ testTopology_auto_design_expected.json
# with added constraints to cover more test cases
@pytest.mark.parametrize('source, destination, route_list, hoptype, expected_correction', [
('trx Brest_KLA', 'trx Vannes_KBE',
('Brest_KLA', 'Vannes_KBE',
'roadm Brest_KLA | roadm Lannion_CAS | roadm Lorient_KMA | roadm Vannes_KBE',
'STRICT',
'no',
['roadm Brest_KLA', 'roadm Lannion_CAS', 'roadm Lorient_KMA', 'roadm Vannes_KBE']),
('trx Brest_KLA', 'trx Vannes_KBE',
('Brest_KLA', 'Vannes_KBE',
'trx Brest_KLA | roadm Lannion_CAS | roadm Lorient_KMA | roadm Vannes_KBE',
'STRICT',
'No',
['roadm Lannion_CAS', 'roadm Lorient_KMA', 'roadm Vannes_KBE']),
('trx Lannion_CAS', 'trx Rennes_STA', 'trx Rennes_STA', 'LOOSE', []),
('trx Lannion_CAS', 'trx Lorient_KMA', 'toto', 'LOOSE', []),
('trx Lannion_CAS', 'trx Lorient_KMA', 'toto', 'STRICT', 'Fail'),
('trx Lannion_CAS', 'trx Lorient_KMA', 'Corlay | Loudeac | Lorient_KMA', 'LOOSE',
('Lannion_CAS', 'Rennes_STA', 'trx Rennes_STA', 'yes', []),
('Lannion_CAS', 'Lorient_KMA', 'toto', 'yes', []),
('Lannion_CAS', 'Lorient_KMA', 'toto', 'no', 'Fail'),
('Lannion_CAS', 'Lorient_KMA', 'Corlay | Loudeac | Lorient_KMA', 'yes',
['west fused spans in Corlay', 'west fused spans in Loudeac', 'roadm Lorient_KMA']),
('trx Lannion_CAS', 'trx Lorient_KMA', 'Ploermel | Vannes_KBE', 'LOOSE',
('Lannion_CAS', 'Lorient_KMA', 'Ploermel | Vannes_KBE', 'yes',
['east edfa in Ploermel to Vannes_KBE', 'roadm Vannes_KBE']),
('trx Rennes_STA', 'trx Brest_KLA', 'Vannes_KBE | Quimper | Brest_KLA', 'LOOSE',
('Rennes_STA', 'Brest_KLA', 'Vannes_KBE | Quimper | Brest_KLA', 'yes',
['roadm Vannes_KBE', 'west edfa in Quimper to Lorient_KMA', 'roadm Brest_KLA']),
('trx Brest_KLA', 'trx Rennes_STA', 'Brest_KLA | Quimper | Lorient_KMA', 'LOOSE',
('Brest_KLA', 'Rennes_STA', 'Brest_KLA | Quimper | Lorient_KMA', 'yes',
['roadm Brest_KLA', 'east edfa in Quimper to Lorient_KMA', 'roadm Lorient_KMA']),
('Brest_KLA', 'trx Rennes_STA', '', 'LOOSE', 'Fail'),
('trx Brest_KLA', 'Rennes_STA', '', 'LOOSE', 'Fail'),
('Brest_KLA', 'Rennes_STA', '', 'LOOSE', 'Fail'),
('Brest_KLA', 'trx Rennes_STA', '', 'STRICT', 'Fail'),
('trx Brest_KLA', 'trx Rennes_STA', 'trx Rennes_STA', 'STRICT', []),
('trx Brest_KLA', 'trx Rennes_STA', None, '', []),
('trx Brest_KLA', 'trx Rennes_STA', 'Brest_KLA | Quimper | Ploermel', 'LOOSE',
('Brest_KLA', 'trx Rennes_STA', '', 'yes', 'Fail'),
('trx Brest_KLA', 'Rennes_STA', '', 'yes', 'Fail'),
('trx Brest_KLA', 'trx Rennes_STA', '', 'yes', 'Fail'),
('Brest_KLA', 'trx Rennes_STA', '', 'no', 'Fail'),
('Brest_KLA', 'Rennes_STA', 'trx Rennes_STA', 'no', []),
('Brest_KLA', 'Rennes_STA', None, '', []),
('Brest_KLA', 'Rennes_STA', 'Brest_KLA | Quimper | Ploermel', 'yes',
['roadm Brest_KLA']),
('trx Brest_KLA', 'trx Rennes_STA', 'Brest_KLA | Quimper | Ploermel', 'STRICT',
('Brest_KLA', 'Rennes_STA', 'Brest_KLA | Quimper | Ploermel', 'no',
['roadm Brest_KLA']),
('trx Brest_KLA', 'trx Rennes_STA', 'Brest_KLA | trx Quimper', 'LOOSE', ['roadm Brest_KLA']),
('trx Brest_KLA', 'trx Rennes_STA', 'Brest_KLA | trx Lannion_CAS', 'LOOSE', ['roadm Brest_KLA']),
('trx Brest_KLA', 'trx Rennes_STA', 'Brest_KLA | trx Lannion_CAS', 'STRICT', 'Fail')
('Brest_KLA', 'Rennes_STA', 'Brest_KLA | trx Quimper', 'yes', ['roadm Brest_KLA']),
('Brest_KLA', 'Rennes_STA', 'Brest_KLA | trx Lannion_CAS', 'yes', ['roadm Brest_KLA']),
('Brest_KLA', 'Rennes_STA', 'Brest_KLA | trx Lannion_CAS', 'no', 'Fail')
])
def test_excel_ila_constraints(source, destination, route_list, hoptype, expected_correction):
"""add different kind of constraints to test all correct_route cases"""
service_xls_input = DATA_DIR / 'testTopology.xls'
network_json_input = DATA_DIR / 'testTopology_auto_design_expected.json'
equipment = load_equipment(eqpt_filename)
network = load_network(network_json_input, equipment)
# increase length of one span to trigger automatic fiber splitting included by autodesign
# so that the test also covers this case
@@ -331,36 +324,20 @@ def test_excel_ila_constraints(source, destination, route_list, hoptype, expecte
p_db = default_si.power_dbm
p_total_db = p_db + lin2db(automatic_nch(default_si.f_min, default_si.f_max, default_si.spacing))
build_network(network, equipment, p_db, p_total_db)
# create params for a request based on input
nodes_list = route_list.split(' | ') if route_list is not None else []
# create params for a xls request based on input (note that this not the same type as PathRequest)
params = {
'request_id': '0',
'source': source,
'bidir': False,
'destination': destination,
'trx_type': '',
'trx_mode': '',
'format': '',
'spacing': '',
'nodes_list': nodes_list,
'loose_list': [hoptype for node in nodes_list] if route_list is not None else '',
'f_min': 0,
'f_max': 0,
'baud_rate': 0,
'OSNR': None,
'bit_rate': None,
'cost': None,
'roll_off': 0,
'tx_osnr': 0,
'penalties': None,
'min_spacing': None,
'trx_type': 'Voyager',
'spacing': 50,
'nodes_list': route_list,
'is_loose': hoptype,
'nb_channel': 0,
'power': 0,
'path_bandwidth': 0,
'effective_freq_slot': None,
'equalization_offset_db': 0
}
request = PathRequest(**params)
request = Request_element(Request(**params), equipment, False)
if expected_correction != 'Fail':
[request] = correct_xls_route_list(service_xls_input, network, [request])
@@ -370,6 +347,55 @@ def test_excel_ila_constraints(source, destination, route_list, hoptype, expecte
[request] = correct_xls_route_list(service_xls_input, network, [request])
@pytest.mark.parametrize('route_list, hoptype, expected_amp_route', [
('node1 | siteE | node2', 'no',
['roadm node1', 'west edfa in siteE', 'roadm node2']),
('node2 | siteE | node1', 'no',
['roadm node2', 'east edfa in siteE', 'roadm node1']),
('node1 | siteF | node2', 'no',
['roadm node1', 'west edfa in siteF', 'roadm node2']),
('node1 | siteA | siteB', 'yes',
['roadm node1', 'west edfa in siteA']),
('node1 | siteA | siteB | node2', 'yes',
['roadm node1', 'west edfa in siteA', 'west edfa in siteB', 'roadm node2']),
('node1 | siteC | node2', 'yes',
['roadm node1', 'east edfa in siteC', 'roadm node2']),
('node1 | siteD | node2', 'no',
['roadm node1', 'west edfa in siteD to node1', 'roadm node2']),
('roadm node1 | Edfa_booster_roadm node1_to_fiber (node1 → siteE)-CABLES#19 | west edfa in siteE | node2',
'no',
['roadm node1', 'Edfa_booster_roadm node1_to_fiber (node1 → siteE)-CABLES#19',
'west edfa in siteE', 'roadm node2'])])
def test_excel_ila_constraints2(route_list, hoptype, expected_amp_route):
"""Check different cases for ILA constraints definition
"""
network_xls_input = DATA_DIR / 'ila_constraint.xlsx'
network = load_network(network_xls_input, equipment)
add_missing_elements_in_network(network, equipment)
default_si = equipment['SI']['default']
p_db = default_si.power_dbm
p_total_db = p_db + lin2db(automatic_nch(default_si.f_min, default_si.f_max, default_si.spacing))
build_network(network, equipment, p_db, p_total_db)
# create params for a request based on input
params = {
'request_id': '0',
'source': 'node1',
'destination': 'node2',
'trx_type': 'Voyager',
'mode': None,
'spacing': 50,
'nodes_list': route_list,
'is_loose': hoptype,
'nb_channel': 80,
'power': 0,
'path_bandwidth': 100,
}
request = Request_element(Request(**params), equipment, False)
[request] = correct_xls_route_list(network_xls_input, network, [request])
assert request.nodes_list == expected_amp_route
def setup_per_degree(case):
"""common setup for degree: returns the dict network for different cases"""
json_network = load_json(DATA_DIR / 'testTopology_expected.json')
@@ -565,3 +591,52 @@ def test_service_json_constraint_order():
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']
@pytest.mark.parametrize('type_variety, target_pch_out_db, correct_variety', [(None, -20, True),
('example_test', -18, True),
('example', None, False)])
def test_roadm_type_variety(type_variety, target_pch_out_db, correct_variety):
"""Checks that if element has no variety, the default one is applied, and if it has one
that the type_variety is correctly applied
"""
json_data = {
"elements": [{
"uid": "roadm Oakland",
"type": "Roadm",
}],
"connections": []
}
expected_roadm = {
"uid": "roadm Oakland",
"type": "Roadm",
"params": {
"restrictions": {
"preamp_variety_list": [],
"booster_variety_list": []
}
},
'metadata': {
'location': {
'city': None,
'latitude': 0,
'longitude': 0,
'region': None
}
}
}
if type_variety is not None:
json_data['elements'][0]['type_variety'] = type_variety
expected_roadm['type_variety'] = type_variety
else:
# Do not add type variety in json_data to test that it creates a 'default' type_variety
expected_roadm['type_variety'] = 'default'
expected_roadm['params']['target_pch_out_db'] = target_pch_out_db
equipment = load_equipment(EQPT_FILENAME, EXTRA_CONFIGS)
if correct_variety:
network = network_from_json(json_data, equipment)
roadm = [n for n in network.nodes()][0]
assert roadm.to_json == expected_roadm
else:
with pytest.raises(ConfigurationError):
network = network_from_json(json_data, equipment)

View File

@@ -0,0 +1,138 @@
#!/usr/bin/env python3
# Module name: test_path_computation_functions.py
# Version:
# License: BSD 3-Clause Licence
# Copyright (c) 2018, Telecom Infra Project
"""
@author: esther.lerouzic
"""
from pathlib import Path
import pytest
from gnpy.core.network import build_network
from gnpy.core.utils import lin2db, automatic_nch
from gnpy.topology.request import explicit_path
from gnpy.topology.spectrum_assignment import build_oms_list
from gnpy.tools.json_io import load_equipment, load_network, requests_from_json
TEST_DIR = Path(__file__).parent
DATA_DIR = TEST_DIR / 'data'
EQPT_FILENAME = DATA_DIR / 'eqpt_config.json'
NETWORK_FILENAME = DATA_DIR / 'testTopology_auto_design_expected.json'
SERVICE_FILENAME = DATA_DIR / 'testTopology_services_expected.json'
EXTRA_CONFIGS = {"std_medium_gain_advanced_config.json": DATA_DIR / "std_medium_gain_advanced_config.json",
"Juniper-BoosterHG.json": DATA_DIR / "Juniper-BoosterHG.json"}
equipment = load_equipment(EQPT_FILENAME, EXTRA_CONFIGS)
@pytest.fixture()
def setup_without_oms():
""" common setup for tests: builds network, equipment and oms only once
"""
network = load_network(NETWORK_FILENAME, equipment)
spectrum = equipment['SI']['default']
p_db = spectrum.power_dbm
p_total_db = p_db + lin2db(automatic_nch(spectrum.f_min, spectrum.f_max, spectrum.spacing))
build_network(network, equipment, p_db, p_total_db)
return network
def some_request(explicit_route):
"""Create a request with an explicit route
"""
route = {
"route-object-include-exclude": [
{
"explicit-route-usage": "route-include-ero",
"index": i,
"num-unnum-hop": {
"node-id": node_id,
"link-tp-id": "link-tp-id is not used",
"hop-type": "STRICT"
}
} for i, node_id in enumerate(explicit_route)
]
}
return {
"path-request": [{
"request-id": "2",
"source": explicit_route[0],
"destination": explicit_route[-1],
"src-tp-id": explicit_route[0],
"dst-tp-id": explicit_route[-1],
"bidirectional": False,
"path-constraints": {
"te-bandwidth": {
"technology": "flexi-grid",
"trx_type": "Voyager",
"trx_mode": "mode 1",
"spacing": 75000000000.0,
"path_bandwidth": 100000000000.0
}
},
"explicit-route-objects": route}
]
}
@pytest.mark.parametrize('setup', ["with_oms", "without_oms"])
@pytest.mark.parametrize('explicit_route, expected_path', [
(['trx Brest_KLA', 'trx Vannes_KBE'], None),
# path contains one element per oms
(['trx Brest_KLA', 'east edfa in Brest_KLA to Morlaix', 'trx Lannion_CAS'],
['trx Brest_KLA', 'roadm Brest_KLA', 'east edfa in Brest_KLA to Morlaix', 'fiber (Brest_KLA → Morlaix)-F060',
'east fused spans in Morlaix', 'fiber (Morlaix → Lannion_CAS)-F059', 'west edfa in Lannion_CAS to Morlaix',
'roadm Lannion_CAS', 'trx Lannion_CAS']),
# path contains several elements per oms
(['trx Brest_KLA', 'east edfa in Brest_KLA to Morlaix', 'west edfa in Lannion_CAS to Morlaix',
'roadm Lannion_CAS', 'trx Lannion_CAS'],
['trx Brest_KLA', 'roadm Brest_KLA', 'east edfa in Brest_KLA to Morlaix', 'fiber (Brest_KLA → Morlaix)-F060',
'east fused spans in Morlaix', 'fiber (Morlaix → Lannion_CAS)-F059', 'west edfa in Lannion_CAS to Morlaix',
'roadm Lannion_CAS', 'trx Lannion_CAS']),
# path contains all elements
(['trx Brest_KLA', 'roadm Brest_KLA', 'east edfa in Brest_KLA to Morlaix', 'fiber (Brest_KLA → Morlaix)-F060',
'east fused spans in Morlaix', 'fiber (Morlaix → Lannion_CAS)-F059', 'west edfa in Lannion_CAS to Morlaix',
'roadm Lannion_CAS', 'trx Lannion_CAS'],
['trx Brest_KLA', 'roadm Brest_KLA', 'east edfa in Brest_KLA to Morlaix', 'fiber (Brest_KLA → Morlaix)-F060',
'east fused spans in Morlaix', 'fiber (Morlaix → Lannion_CAS)-F059', 'west edfa in Lannion_CAS to Morlaix',
'roadm Lannion_CAS', 'trx Lannion_CAS']),
# path conteains element for only 1 oms (2 oms path)
(['trx Brest_KLA', 'east edfa in Brest_KLA to Morlaix', 'trx Rennes_STA'], None),
# path contains roadm edges for all OMS, but no element of the OMS
(['trx Brest_KLA', 'roadm Brest_KLA', 'roadm Lannion_CAS', 'trx Lannion_CAS'], None),
# path contains one element for all 3 OMS
(['trx Brest_KLA', 'east edfa in Brest_KLA to Morlaix', 'east edfa in Lannion_CAS to Corlay',
'east edfa in Lorient_KMA to Vannes_KBE', 'trx Vannes_KBE'],
['trx Brest_KLA', 'roadm Brest_KLA', 'east edfa in Brest_KLA to Morlaix', 'fiber (Brest_KLA → Morlaix)-F060',
'east fused spans in Morlaix', 'fiber (Morlaix → Lannion_CAS)-F059', 'west edfa in Lannion_CAS to Morlaix',
'roadm Lannion_CAS', 'east edfa in Lannion_CAS to Corlay', 'fiber (Lannion_CAS → Corlay)-F061',
'west fused spans in Corlay', 'fiber (Corlay → Loudeac)-F010', 'west fused spans in Loudeac',
'fiber (Loudeac → Lorient_KMA)-F054', 'west edfa in Lorient_KMA to Loudeac', 'roadm Lorient_KMA',
'east edfa in Lorient_KMA to Vannes_KBE', 'fiber (Lorient_KMA → Vannes_KBE)-F055',
'west edfa in Vannes_KBE to Lorient_KMA', 'roadm Vannes_KBE', 'trx Vannes_KBE'])])
def test_explicit_path(setup, setup_without_oms, explicit_route, expected_path):
"""tests that explicit path correctly returns the full path if it is possible else that it returns None
"""
network = setup_without_oms
if setup == "with_oms":
# OMS are initiated in elements, so that explicit path can be verified
build_oms_list(network, equipment)
else:
# OMS are not initiated, explicit path can not be computed.
expected_path = None
json_data = some_request(explicit_route)
[req] = requests_from_json(json_data, equipment)
node_list = []
for node in req.nodes_list:
node_list.append(next(el for el in network if el.uid == node))
source = node_list[0]
destination = node_list[-1]
if expected_path is None:
assert explicit_path(node_list, source, destination, network) is None
else:
actual_path = [e.uid for e in explicit_path(node_list, source, destination, network)]
assert actual_path == expected_path

View File

@@ -18,8 +18,12 @@ from gnpy.core.network import build_network
from gnpy.tools.json_io import load_network, load_equipment, network_from_json
network_file_name = Path(__file__).parent.parent / 'tests/LinkforTest.json'
eqpt_library_name = Path(__file__).parent.parent / 'tests/data/eqpt_config.json'
TEST_DIR = Path(__file__).parent
DATA_DIR = TEST_DIR / 'data'
network_file_name = DATA_DIR / 'LinkforTest.json'
eqpt_library_name = DATA_DIR / 'eqpt_config.json'
EXTRA_CONFIGS = {"std_medium_gain_advanced_config.json": DATA_DIR / "std_medium_gain_advanced_config.json",
"Juniper-BoosterHG.json": DATA_DIR / "Juniper-BoosterHG.json"}
@pytest.fixture(params=[(96, 0.05e12), (60, 0.075e12), (45, 0.1e12), (2, 0.1e12)],
@@ -31,7 +35,7 @@ def nch_and_spacing(request):
def propagation(input_power, con_in, con_out, dest):
equipment = load_equipment(eqpt_library_name)
equipment = load_equipment(eqpt_library_name, EXTRA_CONFIGS)
network = load_network(network_file_name, equipment)
# parametrize the network elements with the con losses and adapt gain
@@ -52,7 +56,8 @@ def propagation(input_power, con_in, con_out, dest):
p = db2lin(p) * 1e-3
spacing = 50e9 # THz
si = create_input_spectral_information(f_min=191.3e12, f_max=191.3e12 + 79 * spacing, roll_off=0.15,
baud_rate=32e9, power=p, spacing=spacing, tx_osnr=None)
baud_rate=32e9, spacing=spacing, tx_osnr=None,
tx_power=p)
source = next(transceivers[uid] for uid in transceivers if uid == 'trx A')
sink = next(transceivers[uid] for uid in transceivers if uid == dest)
path = dijkstra_path(network, source, sink)
@@ -177,11 +182,11 @@ def test_json_element(error, json_data, expected_msg):
"""
Check that a missing key is correctly raisong the logger
"""
equipment = load_equipment(eqpt_library_name)
equipment = load_equipment(eqpt_library_name, EXTRA_CONFIGS)
network = network_from_json(json_data, equipment)
elem = next(e for e in network.nodes() if e.uid == 'Elem')
si = create_input_spectral_information(f_min=191.3e12, f_max=196.1e12, roll_off=0.15,
baud_rate=32e9, power=1.0e-3, spacing=50.0e9, tx_osnr=45)
baud_rate=32e9, tx_power=1.0e-3, spacing=50.0e9, tx_osnr=45)
with pytest.raises(error, match=re.escape(expected_msg)):
_ = elem(si)

View File

@@ -19,16 +19,20 @@ from gnpy.core.utils import lin2db, automatic_nch
from gnpy.core.elements import Fused, Roadm, Edfa, Transceiver, EdfaOperational, EdfaParams, Fiber
from gnpy.core.parameters import FiberParams, RoadmParams, FusedParams
from gnpy.core.network import build_network, design_network
from gnpy.tools.json_io import network_from_json, load_equipment, load_json, Amp
from gnpy.tools.json_io import network_from_json, load_equipment, load_json, Amp, _equipment_from_json
from gnpy.core.equipment import trx_mode_params
from gnpy.topology.request import PathRequest, compute_constrained_path, propagate
from gnpy.core.info import create_input_spectral_information, Carrier
from gnpy.core.utils import db2lin, dbm2watt
from gnpy.core.utils import db2lin, dbm2watt, merge_amplifier_restrictions
from gnpy.core.exceptions import ConfigurationError, NetworkTopologyError
TEST_DIR = Path(__file__).parent
EQPT_LIBRARY_NAME = TEST_DIR / 'data/eqpt_config.json'
NETWORK_FILE_NAME = TEST_DIR / 'data/testTopology_expected.json'
DATA_DIR = TEST_DIR / 'data'
EQPT_FILENAME = DATA_DIR / 'eqpt_config.json'
NETWORK_FILE_NAME = DATA_DIR / 'testTopology_expected.json'
EXTRA_CONFIGS = {"std_medium_gain_advanced_config.json": DATA_DIR / "std_medium_gain_advanced_config.json",
"Juniper-BoosterHG.json": DATA_DIR / "Juniper-BoosterHG.json"}
# adding tests to check the roadm restrictions
# mark node_uid amps as fused for testing purpose
@@ -38,7 +42,7 @@ def test_no_amp_feature(node_uid):
test_parser covers partly this behaviour. This test should guaranty that the
feature is preserved even if convert is changed
"""
equipment = load_equipment(EQPT_LIBRARY_NAME)
equipment = load_equipment(EQPT_FILENAME, EXTRA_CONFIGS)
json_network = load_json(NETWORK_FILE_NAME)
for elem in json_network['elements']:
@@ -81,7 +85,7 @@ def test_no_amp_feature(node_uid):
@pytest.fixture()
def equipment():
"""init transceiver class to access snr and osnr calculations"""
equipment = load_equipment(EQPT_LIBRARY_NAME)
equipment = load_equipment(EQPT_FILENAME, EXTRA_CONFIGS)
# define some booster and preamps
restrictions_list = [
{
@@ -130,7 +134,7 @@ def equipment():
}]
# add them to the library
for entry in restrictions_list:
equipment['Edfa'][entry['type_variety']] = Amp.from_json(EQPT_LIBRARY_NAME, **entry)
equipment['Edfa'][entry['type_variety']] = Amp.from_json(EXTRA_CONFIGS, **entry)
return equipment
@@ -212,19 +216,23 @@ def test_restrictions(restrictions, equipment):
raise AssertionError()
@pytest.mark.parametrize('roadm_type_variety, roadm_b_maxloss', [('default', 0),
('example_detailed_impairments', 16.5)])
@pytest.mark.parametrize('power_dbm', [0, +1, -2])
@pytest.mark.parametrize('prev_node_type, effective_pch_out_db', [('edfa', -20.0), ('fused', -22.0)])
def test_roadm_target_power(prev_node_type, effective_pch_out_db, power_dbm):
def test_roadm_target_power(prev_node_type, effective_pch_out_db, power_dbm, roadm_type_variety, roadm_b_maxloss):
"""Check that egress power of roadm is equal to target power if input power is greater
than target power else, that it is equal to input power. Use a simple two hops A-B-C topology
for the test where the prev_node in ROADM B is either an amplifier or a fused, so that the target
power can not be met in this last case.
"""
equipment = load_equipment(EQPT_LIBRARY_NAME)
equipment = load_equipment(EQPT_FILENAME, EXTRA_CONFIGS)
equipment['SI']['default'].power_dbm = power_dbm
json_network = load_json(TEST_DIR / 'data/twohops_roadm_power_test.json')
prev_node = next(n for n in json_network['elements'] if n['uid'] == 'west edfa in node B to ila2')
json_network['elements'].remove(prev_node)
roadm_b = next(element for element in json_network['elements'] if element['uid'] == 'roadm node B')
roadm_b['type_variety'] = roadm_type_variety
if prev_node_type == 'edfa':
prev_node = {'uid': 'west edfa in node B to ila2', 'type': 'Edfa'}
elif prev_node_type == 'fused':
@@ -249,7 +257,9 @@ 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
'nb_channel': nb_channel,
'power': dbm2watt(power_dbm),
'tx_power': dbm2watt(power_dbm)
}
trx_params = trx_mode_params(equipment)
params.update(trx_params)
@@ -258,7 +268,7 @@ def test_roadm_target_power(prev_node_type, effective_pch_out_db, power_dbm):
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)
spacing=req.spacing, tx_osnr=req.tx_osnr, tx_power=req.tx_power)
for i, el in enumerate(path):
if isinstance(el, Roadm):
power_in_roadm = si.signal + si.ase + si.nli
@@ -268,10 +278,9 @@ def test_roadm_target_power(prev_node_type, effective_pch_out_db, power_dbm):
# if previous was an EDFA, power level at ROADM input is enough for the ROADM to apply its
# 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
# ROADM cannot apply this target. In this case, it is assumed that the ROADM has 0 dB loss
# so the output power will be the same as the input power, which for this particular case
# corresponds to -22dBm + power_dbm
# next step (for ROADM modelling) will be to apply a minimum loss for ROADMs !
# ROADM cannot apply this target. If the ROADM has 0 dB loss the output power will be the same
# as the input power, which for this particular case corresponds to -22dBm + power_dbm.
# If ROADM has a minimum losss, then output power will be -22dBm + power_dbm - ROADM loss. !
if prev_node_type == 'edfa':
# edfa prev_node sets input power to roadm to a high enough value:
# check that target power is correctly set in the ROADM
@@ -282,9 +291,10 @@ def test_roadm_target_power(prev_node_type, effective_pch_out_db, power_dbm):
# fused prev_node does not reamplify power after fiber propagation, so input power
# 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)
assert_allclose(el.ref_pch_out_dbm, effective_pch_out_db + power_dbm - roadm_b_maxloss, rtol=1e-3)
# Check that egress power of roadm is not equalized:
# power out is the same as power in minus the ROADM loss.
assert_allclose(power_out_roadm, power_in_roadm / db2lin(roadm_b_maxloss), rtol=1e-3)
assert effective_pch_out_db + power_dbm ==\
pytest.approx(lin2db(min(power_in_roadm) * 1e3), rel=1e-3)
else:
@@ -304,7 +314,9 @@ def create_per_oms_request(network, eqpt, req_power):
'format': '',
'path_bandwidth': 100e9,
'effective_freq_slot': None,
'nb_channel': nb_channel
'nb_channel': nb_channel,
'power': dbm2watt(req_power),
'tx_power': dbm2watt(req_power)
}
trx_params = trx_mode_params(eqpt)
params.update(trx_params)
@@ -332,6 +344,7 @@ def create_per_oms_request(network, eqpt, req_power):
carrier['label'] = ""
carrier['slot_width'] = req.spacing
carrier['delta_pdb'] = 0
carrier['tx_power'] = 1e-3
req.initial_spectrum = {(req.f_min + req.spacing * f): Carrier(**carrier)
for f in range(1, req.nb_channel + 1)}
req_list.append(req)
@@ -346,6 +359,7 @@ def create_per_oms_request(network, eqpt, req_power):
carrier['label'] = ""
carrier['slot_width'] = req.spacing
carrier['delta_pdb'] = 0
carrier['tx_power'] = 1e-3
req.initial_spectrum = {(req.f_min + req.spacing * f): Carrier(**carrier) for f in range(1, req.nb_channel + 1)}
req_list.append(req)
return req_list
@@ -437,7 +451,7 @@ def test_compare_design_propagation_settings(power_dbm, req_power, amp_with_delt
This test also checks all the possible combinations and expected before/after propagation
gain differences. It also checks delta_p applied due to saturation during design.
"""
eqpt = load_equipment(EQPT_LIBRARY_NAME)
eqpt = load_equipment(EQPT_FILENAME, EXTRA_CONFIGS)
eqpt['SI']['default'].power_dbm = power_dbm
json_network = load_json(NETWORK_FILE_NAME)
for element in json_network['elements']:
@@ -527,3 +541,174 @@ def test_compare_design_propagation_settings(power_dbm, req_power, amp_with_delt
getattr(getattr(element_copy, key), subkey), rtol=1e-12)
else:
assert getattr(getattr(element, key), subkey) == getattr(getattr(element_copy, key), subkey)
@pytest.mark.parametrize("restrictions, fail", [
({'preamp_variety_list': [], 'booster_variety_list':[]}, False),
({'preamp_variety_list': ['std_medium_gain', 'std_low_gain'], 'booster_variety_list':['std_medium_gain']}, False),
# the two next amp type_variety do not exist
({'preamp_variety_list': [], 'booster_variety_list':['booster_medium_gain']}, True),
({'preamp_variety_list': ['std_medium_gain', 'preamp_high_gain'], 'booster_variety_list':[]}, True)])
def test_wrong_restrictions(restrictions, fail):
"""Check that sanity_check correctly raises an error when restriction is incorrect and that library
correctly includes restrictions.
"""
json_data = load_json(EQPT_FILENAME)
# define wrong restriction
json_data['Roadm'][0]['restrictions'] = restrictions
if fail:
with pytest.raises(ConfigurationError):
_ = _equipment_from_json(json_data, EXTRA_CONFIGS)
else:
equipment = _equipment_from_json(json_data, EXTRA_CONFIGS)
assert equipment['Roadm']['example_test'].restrictions == restrictions
@pytest.mark.parametrize('roadm, from_degree, to_degree, expected_impairment_id, expected_type', [
('roadm Lannion_CAS', 'trx Lannion_CAS', 'east edfa in Lannion_CAS to Corlay', 1, 'add'),
('roadm Lannion_CAS', 'west edfa in Lannion_CAS to Stbrieuc', 'east edfa in Lannion_CAS to Corlay', 0, 'express'),
('roadm Lannion_CAS', 'west edfa in Lannion_CAS to Stbrieuc', 'trx Lannion_CAS', 2, 'drop'),
('roadm h', 'west edfa in h to g', 'trx h', None, 'drop')
])
def test_roadm_impairments(roadm, from_degree, to_degree, expected_impairment_id, expected_type):
"""Check that impairment id and types are correct
"""
json_data = load_json(NETWORK_FILE_NAME)
for el in json_data['elements']:
if el['uid'] == 'roadm Lannion_CAS':
el['type_variety'] = 'example_detailed_impairments'
equipment = load_equipment(EQPT_FILENAME, EXTRA_CONFIGS)
network = network_from_json(json_data, equipment)
build_network(network, equipment, 0.0, 20.0)
roadm = next(n for n in network.nodes() if n.uid == roadm)
assert roadm.get_roadm_path(from_degree, to_degree).path_type == expected_type
assert roadm.get_roadm_path(from_degree, to_degree).impairment_id == expected_impairment_id
@pytest.mark.parametrize('type_variety, from_degree, to_degree, impairment_id, expected_type', [
(None, 'trx Lannion_CAS', 'east edfa in Lannion_CAS to Corlay', 1, 'add'),
('default', 'trx Lannion_CAS', 'east edfa in Lannion_CAS to Corlay', 3, 'add'),
(None, 'west edfa in Lannion_CAS to Stbrieuc', 'east edfa in Lannion_CAS to Corlay', None, 'express')
])
def test_roadm_per_degree_impairments(type_variety, from_degree, to_degree, impairment_id, expected_type):
"""Check that impairment type is correct also if per degree impairment is defined
"""
json_data = load_json(EQPT_FILENAME)
assert 'type_variety' not in json_data['Roadm'][2]
json_data['Roadm'][2]['roadm-path-impairments'] = [
{
"roadm-path-impairments-id": 1,
"roadm-add-path": [{
"frequency-range": {
"lower-frequency": 191.3e12,
"upper-frequency": 196.1e12
},
"roadm-osnr": 41,
}]
}, {
"roadm-path-impairments-id": 3,
"roadm-add-path": [{
"frequency-range": {
"lower-frequency": 191.3e12,
"upper-frequency": 196.1e12
},
"roadm-inband-crosstalk": 0,
"roadm-osnr": 20,
"roadm-noise-figure": 23
}]
}]
equipment = _equipment_from_json(json_data, EXTRA_CONFIGS)
assert equipment['Roadm']['default'].type_variety == 'default'
json_data = load_json(NETWORK_FILE_NAME)
for el in json_data['elements']:
if el['uid'] == 'roadm Lannion_CAS' and type_variety is not None:
el['type_variety'] = type_variety
el['params'] = {
"per_degree_impairments": [
{
"from_degree": from_degree,
"to_degree": to_degree,
"impairment_id": impairment_id
}]
}
network = network_from_json(json_data, equipment)
build_network(network, equipment, 0.0, 20.0)
roadm = next(n for n in network.nodes() if n.uid == 'roadm Lannion_CAS')
assert roadm.get_roadm_path(from_degree, to_degree).path_type == expected_type
assert roadm.get_roadm_path(from_degree, to_degree).impairment_id == impairment_id
@pytest.mark.parametrize('from_degree, to_degree, impairment_id, error, message', [
('trx Lannion_CAS', 'east edfa in Lannion_CAS to Corlay', 2, NetworkTopologyError,
'Roadm roadm Lannion_CAS path_type is defined as drop but it should be add'), # wrong path_type
('trx Lannion_CAS', 'east edfa toto', 1, ConfigurationError,
'Roadm roadm Lannion_CAS has wrong from-to degree uid trx Lannion_CAS - east edfa toto'), # wrong degree
('trx Lannion_CAS', 'east edfa in Lannion_CAS to Corlay', 11, NetworkTopologyError,
'ROADM roadm Lannion_CAS: impairment profile id 11 is not defined in library') # wrong impairment_id
])
def test_wrong_roadm_per_degree_impairments(from_degree, to_degree, impairment_id, error, message):
"""Check that wrong per degree definitions are correctly catched
"""
equipment = load_equipment(EQPT_FILENAME, EXTRA_CONFIGS)
json_data = load_json(NETWORK_FILE_NAME)
for el in json_data['elements']:
if el['uid'] == 'roadm Lannion_CAS':
el['type_variety'] = 'example_detailed_impairments'
el['params'] = {
"per_degree_impairments": [
{
"from_degree": from_degree,
"to_degree": to_degree,
"impairment_id": impairment_id
}]
}
network = network_from_json(json_data, equipment)
with pytest.raises(error, match=message):
build_network(network, equipment, 0.0, 20.0)
@pytest.mark.parametrize('path_type, type_variety, expected_pmd, expected_pdl, expected_osnr, freq', [
('express', 'default', 5.0e-12, 0.5, None, [191.3e12]), # roadm instance parameters pre-empts library
('express', 'example_test', 5.0e-12, 0.5, None, [191.3e12]),
('express', 'example_detailed_impairments', 0, 0, None, [191.3e12]), # detailed parameters pre-empts global ones
('add', 'default', 5.0e-12, 0.5, None, [191.3e12]),
('add', 'example_test', 5.0e-12, 0.5, None, [191.3e12]),
('add', 'example_detailed_impairments', 0, 0, 41, [191.3e12]),
('add', 'example_detailed_impairments', [0, 0], [0.5, 0], [35, 41], [188.5e12, 191.3e12])])
def test_impairment_initialization(path_type, type_variety, expected_pmd, expected_pdl, expected_osnr, freq):
"""Check that impairments are correctly initialized, with this order:
- use equipment roadm impairments if no impairment are set in the ROADM instance
- use roadm global impairment if roadm global impairment are set
- use roadm detailed impairment for the corresponding path_type if roadm type_variety has detailed impairments
- use roadm per degree impairment if they are defined
"""
equipment = load_equipment(EQPT_FILENAME, EXTRA_CONFIGS)
extra_params = equipment['Roadm'][type_variety].__dict__
roadm_config = {
"uid": "roadm Lannion_CAS",
"params": {
"add_drop_osnr": 38,
"pmd": 5.0e-12,
"pdl": 0.5
}
}
if type_variety != 'default':
roadm_config["type_variety"] = type_variety
roadm_config['params'] = merge_amplifier_restrictions(roadm_config['params'], extra_params)
roadm = Roadm(**roadm_config)
roadm.set_roadm_paths(from_degree='tata', to_degree='toto', path_type=path_type)
assert roadm.get_roadm_path(from_degree='tata', to_degree='toto').path_type == path_type
assert_allclose(roadm.get_impairment('roadm-pmd', freq, from_degree='tata', degree='toto'),
expected_pmd, rtol=1e-12)
assert_allclose(roadm.get_impairment('roadm-pdl', freq, from_degree='tata', degree='toto'),
expected_pdl, rtol=1e-12)
if path_type == 'add':
# we assume for simplicity that add contribution is the same as drop contribution
# add_drop_osnr_db = 10log10(1/add_osnr + 1/drop_osnr)
if type_variety in ['default', 'example_test']:
assert_allclose(roadm.get_impairment('roadm-osnr', freq, from_degree='tata', degree='toto'),
roadm.params.add_drop_osnr + lin2db(2), rtol=1e-12)
else:
assert_allclose(roadm.get_impairment('roadm-osnr', freq, from_degree='tata', degree='toto'),
expected_osnr, rtol=1e-12)

View File

@@ -10,6 +10,7 @@ from pathlib import Path
from pandas import read_csv
from numpy.testing import assert_allclose
from numpy import array
from copy import deepcopy
import pytest
from gnpy.core.info import create_input_spectral_information, create_arbitrary_spectral_information
@@ -22,13 +23,15 @@ from gnpy.core.science_utils import RamanSolver
TEST_DIR = Path(__file__).parent
@pytest.mark.usefixtures('set_sim_params')
def test_fiber():
"""Test the accuracy of propagating the Fiber."""
fiber = Fiber(**load_json(TEST_DIR / 'data' / 'test_science_utils_fiber_config.json'))
fiber.ref_pch_in_dbm = 0.0
# fix grid spectral information generation
spectral_info_input = create_input_spectral_information(f_min=191.3e12, f_max=196.1e12, roll_off=0.15,
baud_rate=32e9, power=1e-3, spacing=50e9, tx_osnr=40.0)
baud_rate=32e9, spacing=50e9, tx_osnr=40.0,
tx_power=1e-3)
# propagation
spectral_info_out = fiber(spectral_info_input)
@@ -48,9 +51,8 @@ def test_fiber():
spectral_info_input = create_arbitrary_spectral_information(frequency=frequency, slot_width=slot_width,
signal=signal, baud_rate=baud_rate, roll_off=0.15,
delta_pdb_per_channel=delta_pdb_per_channel,
tx_osnr=40.0)
# propagation
tx_osnr=40.0, tx_power=1e-3)
# propagation without Raman
spectral_info_out = fiber(spectral_info_input)
p_signal = spectral_info_out.signal
@@ -60,14 +62,27 @@ def test_fiber():
assert_allclose(p_signal, expected_results['signal'], rtol=1e-3)
assert_allclose(p_nli, expected_results['nli'], rtol=1e-3)
# propagation with Raman
SimParams.set_params({'raman_params': {'flag': True}})
spectral_info_out = fiber(spectral_info_input)
p_signal = spectral_info_out.signal
p_nli = spectral_info_out.nli
expected_results = read_csv(TEST_DIR / 'data' / 'test_fiber_flex_expected_with_raman_results.csv')
assert_allclose(p_signal, expected_results['signal'], rtol=1e-3)
assert_allclose(p_nli, expected_results['nli'], rtol=1e-3)
@pytest.mark.usefixtures('set_sim_params')
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)
baud_rate=32e9, spacing=50e9, tx_osnr=40.0,
tx_power=1e-3)
SimParams.set_params(load_json(TEST_DIR / 'data' / 'sim_params.json'))
SimParams().raman_params.solver_spatial_resolution = 5
fiber = RamanFiber(**load_json(TEST_DIR / 'data' / 'test_science_utils_fiber_config.json'))
fiber.ref_pch_in_dbm = 0.0
# propagation
@@ -103,25 +118,25 @@ 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)
baud_rate=32e9, spacing=50e9, tx_osnr=40.0,
tx_power=1e-3)
SimParams.set_params(load_json(TEST_DIR / 'data' / 'sim_params.json'))
fiber = Fiber(**load_json(TEST_DIR / 'data' / 'test_lumped_losses_raman_fiber_config.json'))
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)
SimParams.set_params({'raman_params': {'flag': True, 'order': 2}})
stimulated_raman_scattering = RamanSolver.calculate_stimulated_raman_scattering(spectral_info_input, fiber)
power_profile = stimulated_raman_scattering.power_profile
expected_power_profile = read_csv(TEST_DIR / 'data' / 'test_lumped_losses_fiber_no_pumps.csv', header=None)
expected_power_profile = read_csv(TEST_DIR / 'data' / 'test_lumped_losses_fiber_no_pumps.csv').values
assert_allclose(power_profile, expected_power_profile, rtol=1e-3)
# with Raman pumps
expected_power_profile = read_csv(TEST_DIR / 'data' / 'test_lumped_losses_raman_fiber.csv', header=None)
stimulated_raman_scattering = RamanSolver.calculate_stimulated_raman_scattering(
spectral_info_input, raman_fiber)
SimParams.set_params({'raman_params': {'flag': True, 'order': 1, 'solver_spatial_resolution': 5}})
stimulated_raman_scattering = RamanSolver.calculate_stimulated_raman_scattering(spectral_info_input, raman_fiber)
power_profile = stimulated_raman_scattering.power_profile
expected_power_profile = read_csv(TEST_DIR / 'data' / 'test_lumped_losses_raman_fiber.csv').values
assert_allclose(power_profile, expected_power_profile, rtol=1e-3)
# without Stimulated Raman Scattering
@@ -129,3 +144,26 @@ def test_fiber_lumped_losses_srs(set_sim_params):
stimulated_raman_scattering = RamanSolver.calculate_attenuation_profile(spectral_info_input, fiber)
power_profile = stimulated_raman_scattering.power_profile
assert_allclose(power_profile, expected_power_profile, rtol=1e-3)
@pytest.mark.usefixtures('set_sim_params')
def test_nli_solver():
"""Test the accuracy of NLI solver."""
fiber = Fiber(**load_json(TEST_DIR / 'data' / 'test_science_utils_fiber_config.json'))
fiber.ref_pch_in_dbm = 0.0
# fix grid spectral information generation
spectral_info_input = create_input_spectral_information(f_min=191.3e12, f_max=196.1e12, roll_off=0.15,
baud_rate=32e9, spacing=50e9, tx_osnr=40.0,
tx_power=1e-3)
SimParams.set_params(load_json(TEST_DIR / 'data' / 'sim_params.json'))
sim_params = SimParams()
spectral_info_output = fiber(deepcopy(spectral_info_input))
sim_params.nli_params.method = 'ggn_approx'
sim_params.raman_params.result_spatial_resolution = 10e3
spectral_info_output_approx = fiber(deepcopy(spectral_info_input))
assert_allclose(spectral_info_output.nli, spectral_info_output_approx.nli, rtol=1e-1)

View File

@@ -30,17 +30,19 @@ DATA_DIR = TEST_DIR / 'data'
EQPT_FILENAME = DATA_DIR / 'eqpt_config.json'
NETWORK_FILENAME = DATA_DIR / 'testTopology_auto_design_expected.json'
SERVICE_FILENAME = DATA_DIR / 'testTopology_services_expected.json'
EXTRA_CONFIGS = {"std_medium_gain_advanced_config.json": DATA_DIR / "std_medium_gain_advanced_config.json",
"Juniper-BoosterHG.json": DATA_DIR / "Juniper-BoosterHG.json"}
grid = 0.00625e12
slot = 0.0125e12
guardband = 0.15e12
guardband = 25.0e9
cband_freq_min = 191.3e12
cband_freq_max = 196.1e12
@pytest.fixture()
def equipment():
equipment = load_equipment(EQPT_FILENAME)
equipment = load_equipment(EQPT_FILENAME, EXTRA_CONFIGS)
return equipment
@@ -101,14 +103,15 @@ def test_wrong_values(nval, mval, setup):
def test_aligned(nmin, nmax, setup):
"""Checks that the OMS grid is correctly aligned
Note that bitmap index uses guardband on both ends so that if nmin, nmax = -200, +200,
Note that bitmap index uses guardband on both ends so that if center frequencies nmin, nmax = -200, +200,
min/max navalue in bitmap are -224, +223, which makes 223 -(-224) +1 frequencies.
"""
network, oms_list = setup
nguard = guardband / grid
center = 193.1e12
freq_min = center + nmin * grid
freq_max = center + nmax * grid
# amplification band
freq_min = center + nmin * grid - guardband
freq_max = center + nmax * grid + guardband
random_oms = oms_list[10]
# We're always starting with full C-band
@@ -116,9 +119,9 @@ def test_aligned(nmin, nmax, setup):
assert pytest.approx(nvalue_to_frequency(random_oms.spectrum_bitmap.freq_index_max) * 1e-12, abs=1e-12) == 196.1
ind_max = len(random_oms.spectrum_bitmap.bitmap) - 1
# "inner" frequencies, without the guard baand
# "inner" frequencies, without the guard band
inner_n_min = random_oms.spectrum_bitmap.getn(0) + nguard
inner_n_max = random_oms.spectrum_bitmap.getn(ind_max) - nguard + 1
inner_n_max = random_oms.spectrum_bitmap.getn(ind_max) - nguard
assert inner_n_min == random_oms.spectrum_bitmap.freq_index_min
assert inner_n_max == random_oms.spectrum_bitmap.freq_index_max
assert inner_n_min == -288
@@ -136,7 +139,7 @@ def test_aligned(nmin, nmax, setup):
ind_max = len(random_oms.spectrum_bitmap.bitmap) - 1
inner_n_min = random_oms.spectrum_bitmap.getn(0) + nguard
inner_n_max = random_oms.spectrum_bitmap.getn(ind_max) - nguard + 1
inner_n_max = random_oms.spectrum_bitmap.getn(ind_max) - nguard
assert inner_n_min == random_oms.spectrum_bitmap.freq_index_min
assert inner_n_max == random_oms.spectrum_bitmap.freq_index_max
@@ -198,18 +201,20 @@ def test_assign_and_sum(nval1, nval2, setup):
def test_bitmap_assignment(setup):
"""test that a bitmap can be assigned"""
network, oms_list = setup
_, oms_list = setup
random_oms = oms_list[2]
random_oms.assign_spectrum(13, 7)
btmp = deepcopy(random_oms.spectrum_bitmap.bitmap)
# try a first assignment that must pass
spectrum_btmp = Bitmap(cband_freq_min, cband_freq_max, grid=0.00625e12, guardband=0.15e12, bitmap=btmp)
freq_min = nvalue_to_frequency(random_oms.spectrum_bitmap.n_min)
freq_max = nvalue_to_frequency(random_oms.spectrum_bitmap.n_max)
_ = Bitmap(freq_min, freq_max, grid=0.00625e12, guardband=guardband, bitmap=btmp)
# try a wrong assignment that should not pass
btmp = btmp[1:-1]
with pytest.raises(SpectrumError):
spectrum_btmp = Bitmap(cband_freq_min, cband_freq_max, grid=0.00625e12, guardband=0.15e12, bitmap=btmp)
_ = Bitmap(cband_freq_min, cband_freq_max, grid=0.00625e12, guardband=guardband, bitmap=btmp)
@pytest.fixture()
@@ -288,6 +293,7 @@ def request_set():
'cost': 1,
'roll_off': 0.15,
'tx_osnr': 38,
'tx_power': 0.001,
'penalties': {},
'min_spacing': 37.5e9,
'nb_channel': None,

Some files were not shown because too many files have changed in this diff Show More