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