LaserSource.cc revision 10447:a465576671d4
1#include "model/optical/LaserSource.h"
2
3#include "model/optical_graph/OpticalWaveguide.h"
4#include "model/optical_graph/OpticalWavelength.h"
5#include "model/optical_graph/OpticalLaser.h"
6#include "model/optical_graph/OpticalGraph.h"
7
8namespace DSENT
9{
10    LaserSource::LaserSource(const String& instance_name_, const TechModel* tech_model_)
11        : OpticalModel(instance_name_, tech_model_)
12    {
13        initParameters();
14        initProperties();
15    }
16
17    LaserSource::~LaserSource()
18    {}
19
20    void LaserSource::initParameters()
21    {
22        addParameterName("OutStart");
23        addParameterName("OutEnd");
24        addParameterName("MaxDetectors");
25        return;
26    }
27
28    void LaserSource::initProperties()
29    {
30		addPropertyName("OptUtil", 1.0);
31        return;
32    }
33
34    void LaserSource::constructModel()
35    {
36        // Create Area result
37        Result* area_result = new AtomicResult("Photonic");
38        addAreaResult(area_result);
39        // Create NDD power result
40        Result* power_result = new AtomicResult("Laser");
41        addNddPowerResult(power_result);
42
43        // Get parameters
44        WavelengthGroup laser_wavelengths = makeWavelengthGroup(getParameter("OutStart"), getParameter("OutEnd"));
45
46        // Create optical ports
47        createOpticalOutputPort(    "Out",      laser_wavelengths);
48        // Create the filter
49        createLaser(                "Laser",    laser_wavelengths);
50        OpticalLaser* laser = getLaser("Laser");
51        // Connect the laser to the output
52        laser->addDownstreamNode(getWaveguide("Out"));
53    }
54
55    void LaserSource::updateModel()
56    {
57        // Get properties
58        double laser_efficiency = getTechModel()->get("Laser->CW->Efficiency").toDouble();
59        double laser_area = getTechModel()->get("Laser->CW->Area").toDouble();
60        double laser_diode_loss = getTechModel()->get("Laser->CW->LaserDiodeLoss");
61
62        // Get parameters
63        WavelengthGroup laser_wavelengths = makeWavelengthGroup(getParameter("OutStart"), getParameter("OutEnd"));
64        unsigned int number_wavelengths = laser_wavelengths.second - laser_wavelengths.first + 1;
65        // Update losses
66        OpticalLaser* laser = getLaser("Laser");
67        laser->setLoss(laser_diode_loss);
68        laser->setEfficiency(laser_efficiency);
69        // Update area
70        getAreaResult("Photonic")->setValue(laser_area * number_wavelengths);
71    }
72
73    void LaserSource::evaluateModel()
74    {
75        // Get parameters
76        unsigned int max_detectors = getParameter("MaxDetectors").toUInt();
77        WavelengthGroup laser_wavelengths = makeWavelengthGroup(getParameter("OutStart"), getParameter("OutEnd"));
78
79		// Get properties
80		double opt_util = getProperty("OptUtil");
81
82        // Create optical graph object
83        OpticalGraph* optical_graph = new OpticalGraph("LaserTrace", this);
84        // Ask optical graph object to perform power optimization
85        bool success = optical_graph->performPowerOpt(getLaser("Laser"), laser_wavelengths, max_detectors, opt_util);
86        if (!success)
87        {
88            Log::printLine(std::cerr, "[Warning] " + getInstanceName() +
89                " -> Wavelengths contains data paths with no possible modulator configurations!");
90        }
91        // Trace the wavelengths the laser is outputting to find the output
92        // power needed by the laser
93        OpticalWavelength* wavelength = optical_graph->traceWavelength(laser_wavelengths, getLaser("Laser"));
94        // Calculate the power needed by the wavelength
95        double laser_power = wavelength->getLaserPower(max_detectors);
96
97        // Calculate NDD power
98        getNddPowerResult("Laser")->setValue(laser_power);
99
100        delete wavelength;
101        delete optical_graph;
102    }
103
104} // namespace DSENT
105
106