mirror of
https://github.com/Telecominfraproject/oopt-gnpy.git
synced 2025-10-31 18:18:00 +00:00
carrier probe point for Edfa and Fiber elements
save and be able to retrieve the carrier information processed by Edfa and Fiber elements: @ input & output of the element - channel power: ase, nli, signal and total Signed-off-by: Jean-Luc Auge <jeanluc.auge@orange.com>
This commit is contained in:
@@ -98,6 +98,12 @@ def main(network, equipment, source, destination, req = None):
|
|||||||
propagate(path, req, equipment, show=len(power_range)==1)
|
propagate(path, req, equipment, show=len(power_range)==1)
|
||||||
print(f'\nTransmission result for input power = {lin2db(req.power*1e3):.2f}dBm :')
|
print(f'\nTransmission result for input power = {lin2db(req.power*1e3):.2f}dBm :')
|
||||||
print(destination)
|
print(destination)
|
||||||
|
|
||||||
|
#print(f'\n !!!!!!!!!!!!!!!!! TEST POINT !!!!!!!!!!!!!!!!!!!!!')
|
||||||
|
#print(f'carriers ase output of {path[1]} =\n {list(path[1].carriers("out", "nli"))}')
|
||||||
|
# => use "in" or "out" parameter
|
||||||
|
# => use "nli" or "ase" or "signal" or "total" parameter
|
||||||
|
|
||||||
simulation_data.append({
|
simulation_data.append({
|
||||||
'Pch_dBm' : pref_ch_db + dp_db,
|
'Pch_dBm' : pref_ch_db + dp_db,
|
||||||
'OSNR_ASE_0.1nm' : round(mean(destination.osnr_ase_01nm),2),
|
'OSNR_ASE_0.1nm' : round(mean(destination.osnr_ase_01nm),2),
|
||||||
|
|||||||
@@ -217,6 +217,8 @@ class Fiber(Node):
|
|||||||
self.dispersion = self.params.dispersion # s/m/m
|
self.dispersion = self.params.dispersion # s/m/m
|
||||||
self.gamma = self.params.gamma # 1/W/m
|
self.gamma = self.params.gamma # 1/W/m
|
||||||
self.pch_out_db = None
|
self.pch_out_db = None
|
||||||
|
self.carriers_in = None
|
||||||
|
self.carriers_out = None
|
||||||
# TODO|jla: discuss factor 2 in the linear lineic attenuation
|
# TODO|jla: discuss factor 2 in the linear lineic attenuation
|
||||||
|
|
||||||
@property
|
@property
|
||||||
@@ -282,6 +284,25 @@ class Fiber(Node):
|
|||||||
aleff = 1 / (2 * alpha)
|
aleff = 1 / (2 * alpha)
|
||||||
return aleff
|
return aleff
|
||||||
|
|
||||||
|
def carriers(self, loc, attr):
|
||||||
|
"""retrieve carriers information
|
||||||
|
loc = (in, out) of the class element
|
||||||
|
attr = (ase, nli, signal, total) power information"""
|
||||||
|
if not (loc in ('in', 'out') and attr in ('nli', 'signal', 'total', 'ase')):
|
||||||
|
yield None
|
||||||
|
return
|
||||||
|
power_dict = {
|
||||||
|
'nli': 'nonlinear_interference',
|
||||||
|
'ase': 'amplified_spontaneous_emission'
|
||||||
|
}
|
||||||
|
attr = power_dict.get(attr, attr)
|
||||||
|
loc_attr = 'carriers_'+loc
|
||||||
|
for c in getattr(self, loc_attr) :
|
||||||
|
if attr == 'total':
|
||||||
|
yield c.power.ase+c.power.nli+c.power.signal
|
||||||
|
else:
|
||||||
|
yield c.power._asdict().get(attr, None)
|
||||||
|
|
||||||
def beta2(self, ref_wavelength=None):
|
def beta2(self, ref_wavelength=None):
|
||||||
""" Returns beta2 from dispersion parameter.
|
""" Returns beta2 from dispersion parameter.
|
||||||
Dispersion is entered in ps/nm/km.
|
Dispersion is entered in ps/nm/km.
|
||||||
@@ -370,8 +391,10 @@ class Fiber(Node):
|
|||||||
return pref._replace(p_span0=pref.p0, p_spani=self.pch_out_db)
|
return pref._replace(p_span0=pref.p0, p_spani=self.pch_out_db)
|
||||||
|
|
||||||
def __call__(self, spectral_info):
|
def __call__(self, spectral_info):
|
||||||
|
self.carriers_in = spectral_info.carriers
|
||||||
carriers = tuple(self.propagate(*spectral_info.carriers))
|
carriers = tuple(self.propagate(*spectral_info.carriers))
|
||||||
pref = self.update_pref(spectral_info.pref)
|
pref = self.update_pref(spectral_info.pref)
|
||||||
|
self.carriers_out = carriers
|
||||||
return spectral_info.update(carriers=carriers, pref=pref)
|
return spectral_info.update(carriers=carriers, pref=pref)
|
||||||
|
|
||||||
class EdfaParams:
|
class EdfaParams:
|
||||||
@@ -435,6 +458,8 @@ class Edfa(Node):
|
|||||||
self.passive = False
|
self.passive = False
|
||||||
self.effective_gain = self.operational.gain_target
|
self.effective_gain = self.operational.gain_target
|
||||||
self.att_in = None
|
self.att_in = None
|
||||||
|
self.carriers_in = None
|
||||||
|
self.carriers_out = None
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def to_json(self):
|
def to_json(self):
|
||||||
@@ -481,6 +506,25 @@ class Edfa(Node):
|
|||||||
f' effective pch (dBm): {self.effective_pch_out_db!r}',
|
f' effective pch (dBm): {self.effective_pch_out_db!r}',
|
||||||
f' output VOA (dB): {self.operational.out_voa:.2f}'])
|
f' output VOA (dB): {self.operational.out_voa:.2f}'])
|
||||||
|
|
||||||
|
def carriers(self, loc, attr):
|
||||||
|
"""retrieve carriers information
|
||||||
|
loc = (in, out) of the class element
|
||||||
|
attr = (ase, nli, signal, total) power information"""
|
||||||
|
if not (loc in ('in', 'out') and attr in ('nli', 'signal', 'total', 'ase')):
|
||||||
|
yield None
|
||||||
|
return
|
||||||
|
power_dict = {
|
||||||
|
'nli': 'nonlinear_interference',
|
||||||
|
'ase': 'amplified_spontaneous_emission'
|
||||||
|
}
|
||||||
|
attr = power_dict.get(attr, attr)
|
||||||
|
loc_attr = 'carriers_'+loc
|
||||||
|
for c in getattr(self, loc_attr) :
|
||||||
|
if attr == 'total':
|
||||||
|
yield c.power.ase+c.power.nli+c.power.signal
|
||||||
|
else:
|
||||||
|
yield c.power._asdict().get(attr, None)
|
||||||
|
|
||||||
def interpol_params(self, frequencies, pin, baud_rates, pref):
|
def interpol_params(self, frequencies, pin, baud_rates, pref):
|
||||||
"""interpolate SI channel frequencies with the edfa dgt and gain_ripple frquencies from json
|
"""interpolate SI channel frequencies with the edfa dgt and gain_ripple frquencies from json
|
||||||
set the edfa class __init__ None parameters :
|
set the edfa class __init__ None parameters :
|
||||||
@@ -722,6 +766,8 @@ class Edfa(Node):
|
|||||||
p_spani=pref.pi + self.effective_gain - self.operational.out_voa)
|
p_spani=pref.pi + self.effective_gain - self.operational.out_voa)
|
||||||
|
|
||||||
def __call__(self, spectral_info):
|
def __call__(self, spectral_info):
|
||||||
|
self.carriers_in = spectral_info.carriers
|
||||||
carriers = tuple(self.propagate(spectral_info.pref, *spectral_info.carriers))
|
carriers = tuple(self.propagate(spectral_info.pref, *spectral_info.carriers))
|
||||||
pref = self.update_pref(spectral_info.pref)
|
pref = self.update_pref(spectral_info.pref)
|
||||||
|
self.carriers_out = carriers
|
||||||
return spectral_info.update(carriers=carriers, pref=pref)
|
return spectral_info.update(carriers=carriers, pref=pref)
|
||||||
|
|||||||
Reference in New Issue
Block a user