mirror of
https://github.com/Telecominfraproject/oopt-gnpy.git
synced 2026-01-27 10:21:48 +00:00
osnr calculation
This commit is contained in:
3
.gitignore
vendored
3
.gitignore
vendored
@@ -60,3 +60,6 @@ target/
|
||||
|
||||
# pyenv python configuration file
|
||||
.python-version
|
||||
|
||||
# MacOS DS_store
|
||||
.DS_Store
|
||||
|
||||
@@ -5,11 +5,11 @@
|
||||
"name": "",
|
||||
"description": "Booster_Connection",
|
||||
"parameters": {
|
||||
"length": 0.0,
|
||||
"length": 80.0,
|
||||
"dispersion": null,
|
||||
"dispersion_slope": 16.7,
|
||||
"pmd": 0.0,
|
||||
"loss": 0.0,
|
||||
"loss": 0.2,
|
||||
"fiber_type": "SMF-28e",
|
||||
"nonlinear_coef": 0.0
|
||||
}
|
||||
@@ -20,11 +20,11 @@
|
||||
"name": "",
|
||||
"description": "Booster_Connection",
|
||||
"parameters": {
|
||||
"length": 0.0,
|
||||
"length": 100.0,
|
||||
"dispersion": null,
|
||||
"dispersion_slope": 16.7,
|
||||
"pmd": 0.0,
|
||||
"loss": 0.0,
|
||||
"loss": 0.2,
|
||||
"fiber_type": "SMF-28e",
|
||||
"nonlinear_coef": 0.0
|
||||
}
|
||||
@@ -35,11 +35,11 @@
|
||||
"name": "",
|
||||
"description": "Booster_Connection",
|
||||
"parameters": {
|
||||
"length": 0.0,
|
||||
"length": 80.0,
|
||||
"dispersion": null,
|
||||
"dispersion_slope": 16.7,
|
||||
"pmd": 0.0,
|
||||
"loss": 0.0,
|
||||
"loss": 0.2,
|
||||
"fiber_type": "SMF-28e",
|
||||
"nonlinear_coef": 0.0
|
||||
}
|
||||
@@ -110,7 +110,7 @@
|
||||
"channels": [{
|
||||
"manufacturer": "acme corp",
|
||||
"manufacturer_pn": "acme model1",
|
||||
"frequency": [193.95],
|
||||
"frequency": 193.95,
|
||||
"modulation": "QPSK",
|
||||
"baud_rate": 32.0,
|
||||
"capacity": 100,
|
||||
@@ -121,12 +121,12 @@
|
||||
"filter_params": [0.4],
|
||||
"polarization_mux": "interleaved",
|
||||
"osnr": 40.0,
|
||||
"power": -5.0
|
||||
"power": -10.0
|
||||
},
|
||||
{
|
||||
"manufacturer": "acme corp",
|
||||
"manufacturer_pn": "acme model1",
|
||||
"frequency": [194.15],
|
||||
"frequency": 194.15,
|
||||
"modulation": "QPSK",
|
||||
"baud_rate": 32.0,
|
||||
"capacity": 100,
|
||||
|
||||
@@ -1,22 +1,55 @@
|
||||
import matplotlib.pyplot as plt
|
||||
import networkx as nx
|
||||
import gnpy
|
||||
import numpy as np
|
||||
from pprint import pprint as pp
|
||||
plt.rcdefaults()
|
||||
|
||||
|
||||
config_fn = './gnpy/examples/config/config_ex1.json'
|
||||
nw = gnpy.Network(config_fn)
|
||||
|
||||
|
||||
def db_to_lin(val):
|
||||
return 10 ** (val / 10)
|
||||
|
||||
|
||||
def chan_osnr(chan_params, amp_params):
|
||||
in_osnr = db_to_lin(chan_params['osnr'])
|
||||
pin = db_to_lin(chan_params['power']) / 1e3
|
||||
nf = db_to_lin(amp_params.nf[0])
|
||||
ase_cont = nf * gnpy.h * chan_params['frequency'] * 12.5 * 1e21
|
||||
ret = -10 * np.log10(1 / in_osnr + ase_cont / pin)
|
||||
return ret
|
||||
|
||||
|
||||
def edge_dict(chan, osnr, d_power):
|
||||
dct = {'frequency': chan['frequency'],
|
||||
'osnr': osnr if osnr else chan['osnr'],
|
||||
'power': chan['power'] + d_power}
|
||||
return dct
|
||||
|
||||
|
||||
def calc_path_osnr(nw, opath):
|
||||
print(opath)
|
||||
pp(opath[0].params.channels)
|
||||
return None
|
||||
for en, chan in enumerate(opath[0].params.channels):
|
||||
for pen, p in enumerate(opath):
|
||||
print(en, type(p), p, pen)
|
||||
print("*** ")
|
||||
for en, leg in enumerate(opath[:-1]):
|
||||
edge = nw.g[opath[en]][opath[en + 1]]
|
||||
suc_class = opath[en].__class__
|
||||
if suc_class == gnpy.network_elements.Tx:
|
||||
for chan in opath[en].params.channels:
|
||||
edge['channels'].append(edge_dict(chan, None, 0))
|
||||
elif suc_class == gnpy.network_elements.Fiber:
|
||||
attn = opath[en].params.length * opath[en].params.loss
|
||||
for inedge in nw.g.in_edges([opath[en]]):
|
||||
pedge = nw.g[inedge[0]][inedge[1]]
|
||||
for chan in pedge['channels']:
|
||||
edge['channels'].append(edge_dict(chan, None, -attn))
|
||||
elif suc_class == gnpy.network_elements.Edfa:
|
||||
for inedge in nw.g.in_edges([opath[en]]):
|
||||
pedge = nw.g[inedge[0]][inedge[1]]
|
||||
gain = opath[en].params.gain
|
||||
for chan in pedge['channels']:
|
||||
osnr = chan_osnr(chan, opath[en].params)
|
||||
edge['channels'].append(edge_dict(chan, osnr, gain[0]))
|
||||
print(leg, edge['channels'])
|
||||
|
||||
|
||||
def calc_osnr(nw):
|
||||
@@ -24,14 +57,17 @@ def calc_osnr(nw):
|
||||
for rx in nw.nw_elems['Rx']:
|
||||
for opath in nx.all_simple_paths(nw.g, tx, rx):
|
||||
calc_path_osnr(nw, opath)
|
||||
print("*" * 10)
|
||||
|
||||
|
||||
calc_osnr(nw)
|
||||
|
||||
|
||||
if 0:
|
||||
graph_pos = nx.fruchterman_reingold_layout(nw.g)
|
||||
nx.draw_networkx_nodes(nw.g, graph_pos, node_size=1000, node_color='b', alpha=0.2)
|
||||
nx.draw_networkx_edges(nw.g, graph_pos, width=2, alpha=0.3, edge_color='green')
|
||||
nx.draw_networkx_labels(nw.g, graph_pos, font_size=10)
|
||||
if 1:
|
||||
layout = nx.spring_layout(nw.g)
|
||||
nx.draw_networkx_nodes(nw.g, layout, node_size=1000,
|
||||
node_color='b', alpha=0.2)
|
||||
nx.draw_networkx_labels(nw.g, layout)
|
||||
nx.draw_networkx_edges(nw.g, layout, width=2,
|
||||
alpha=0.3, edge_color='green')
|
||||
#nx.draw_networkx_edge_labels(nw.g, layout, font_size=10)
|
||||
plt.show()
|
||||
|
||||
@@ -15,10 +15,6 @@ class Params:
|
||||
setattr(self, k, v)
|
||||
|
||||
|
||||
class Channels():
|
||||
pass
|
||||
|
||||
|
||||
class Network:
|
||||
g = nx.DiGraph()
|
||||
nw_elems = {}
|
||||
@@ -38,7 +34,7 @@ class Network:
|
||||
n0 = Utils.find_by_node_id(self.g, gpath[0])
|
||||
for nid in gpath[1:]:
|
||||
n1 = Utils.find_by_node_id(self.g, nid)
|
||||
self.g.add_edge(n0, n1, channels=Channels())
|
||||
self.g.add_edge(n0, n1, channels=[])
|
||||
n0 = n1
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user