OEIL
NonlinearLossModel.h
1 #ifndef NONLINEARLOSSMODEL_H
2 #define NONLINEARLOSSMODEL_H
3 
4 // #define __DEBUG_
5 
6 #include <boost/array.hpp>
7 #include <boost/property_tree/ini_parser.hpp>
8 #include <boost/property_tree/ptree.hpp>
9 #include <cmath>
10 #include <iostream>
11 #include <vector>
12 
13 #include <boost/numeric/odeint.hpp>
14 #include <fstream>
15 
16 /*
17  * References
18  * [1] M. Dinu, F. Quochi, and H. Garcia, “Third-order nonlinearities in silicon at telecom wavelengths,” Appl. Phys. Lett., vol.
19  * 82, no. 18, pp. 2954–2956, Apr. 2003. [2] K. Dietmar, Silicon-Organic Hybrid Platform for Photonic Integrated Circuits. KIT
20  * Scientific Publishing, 2015.
21  */
22 
23 extern double laser_wavelength;
24 extern double propagation_loss;
25 extern double effective_mode_area;
26 extern double carrier_lifetime;
27 extern double TPA_coefficient;
28 extern double FCA_coefficient;
29 
30 /* The type of container used to hold the state vector */
31 typedef std::array<double, 1> intensity_state;
32 
33 namespace utils {
34 double loss_dB2scalar(double loss_in_dB);
35 double loss_scaler2dB(double loss_in_scalar);
36 }
37 
39  std::vector<intensity_state>& intensities;
40  std::vector<double>& times;
41 
42  push_back_intensity_and_distance(std::vector<intensity_state>& t_intensities, std::vector<double>& t_times)
43  : intensities(t_intensities)
44  , times(t_times) {}
45 
46  void operator()(const intensity_state& intensity, double time) {
47  intensities.push_back(intensity);
48  times.push_back(time);
49  }
50 };
51 
53  protected:
54  /* Constant */
55  const double kPhotonEnergy1550; // J
56  const double kStartPosition; // start from the head of a waveguide
57  const double kWavelength; // Default: C-band: 1.55um
58  const double kStepLength;
59 
60  /* Input parameters */
61  // major adjustables
62  double alpha_dB_; // Default: Linear loss: 0.2dB/cm
63  double carrier_lifetime_; // Default: 4e-9s
64  double effective_mode_area_; // Default: 1e-8cm^2
65  double stop_position_; // Length of the wavelength in question. Default: 1.5cm
66  double initial_power_; // The coupled power at distance 0. Default: 100e-3W (100mW)
67 
68  // minor adjustables
69  double beta_; // Default: TPA coefficient at 1550nm [1]
70  double sigma_; // Default: FCA coefficient: 1.45*10^17 cm2 [2]
71 
72  // derived model parameters
73  double photon_energy_; // Default: hv at 1.55um is 1.28 * 10^-19 J
74  double alpha_;
75  double gamma_;
76  double initial_intensity_;
77 
78  // result buffer
79  double totalLoss_;
80 
81  void initParameters();
82  void updateModel();
83 
84  public:
85 #ifdef __DEBUG_
87 #endif
88  NonlinearLossModel(double coupled_in_power, double waveguideLength);
89 
90  virtual void echoParameters();
91 
92  // getters
93  double getLinearLossPerLength() const { return alpha_dB_; }
94  double getCarrierLifetime() const { return carrier_lifetime_; }
95  double getEffectiveModeArea() const { return effective_mode_area_; }
96  double getStartPosition() const { return kStartPosition; }
97  double getStopPosition() const { return stop_position_; }
98  double getInitialPower() const { return initial_power_; }
99  double getInitialIntensity() const { return initial_intensity_; }
100 
101  // setters
102  void setLinearLoss(double linearLoss_dB);
103  void setCarrierLifetime(double lifetime);
104  void setEffectiveModeArea(double Aeff);
105  void setWaveguideLength(double length);
106  void setInitialPower(double initalPower);
107 
108  // loaders
109  void resetParameters();
110  void setParametersFromFile();
111 
112  virtual void operator()(const intensity_state& I, intensity_state& dIdz, const double z) const;
113 
114  double totalLossAcrossWaveguide();
115  double totalLossAcrossWaveguide(double initalPower);
116  double linearLossAcrossWaveguide();
117  double nonlinearLossAcrossWaveguide();
118  double nonlinearLossAcrossWaveguide(double initalPower);
119 };
120 
121 #endif
Definition: NonlinearLossModel.h:52
Definition: NonlinearLossModel.h:38
Definition: NonlinearLossModel.h:33