Optimization of Mid-IR Quantum Cascade Laser Gain¶
Note
The nextnanoevo Python package is under development. Its release is planned for 2024.
Header¶
- Relevant files
MidIR_QCL_InGaAs_InAlAs_Bai_NaturePhot2010_nextnanoevo.negf
MIdIR_QCL_example.py (not available public yet)
- Relevant output files:
330mV/Gain/SemiClassical_vs_Energy_[0.0,0.0,1.0].dat
- Scope
design optimization
QCL
NEGF
laser gain
- Important variables
$thickness_scaling_factor
(scaling factor for all wells and barries in QCL heterostructure)
Introduction¶
This tutorial shows how to optimize the gain of a 1D Mid-IR Quantum Cascade Laser (QCL) using the The nextnanoevo Python package. The goal is to maximize the gain of the QCL by varying the thickness of the quantum wells and barriers. The gain is calculated using the nextnano.NEGF.
Starting point¶
The starting point is the design of a Mid-IR QCL with a peak gain at photon energy of 275 meV. The design consists of sequence of InGaAs wells and AlInAs barriers with applied 330 mV bias ([Bai2010].)
The bandedges are shown in the figure below
The simulated gain with the peak at 275 meV is shown in the figure below
Optimization objective¶
The goal is to maximize the gain of the QCL at 270 meV by varying the thickness of the quantum wells and barriers. All the wells and barriers will be scaled by the same factor.
Variables under optimization:
Name |
Units |
Initial value |
Bounds |
---|---|---|---|
|
– |
10.0 |
0.9-1.1 |
Target output:
Name |
Units |
Initial value |
Target |
---|---|---|---|
Gain at 270 meV |
\(cm^{-1}\) |
199.49 |
max |
Optimization script¶
At first, specify input file, variables, and relevant output files in the IO
instance:
from nextnanoevo.IO import IO
output_files = [("330mV", "Gain", "SemiClassical_vs_Energy_[0.0,0.0,1.0].dat")]
nn_io = IO(
input_file_path,
variable_names=["thickness_scaling_factor"],
target_output_paths=output_files,
)
Next, define the metric to get the gain at 270 meV.
def get_gain_at_270mev(df_list):
df = df_list[0]
energy = df.coords["Photon Energy"].value
gain = df.variables["Gain"].value
# get gain exactly at 270 meV
mask = np.isclose(energy, 270, atol=0.001)
gain_at_270mev = gain[mask]
# minus sign to transform maximization to minimization
return -gain_at_270mev
Define the Metric Metric class
from nextnanoevo import Metric
metric = Metric(input_length=1, output_length=1, extraction_function=get_gain_at_270mev)
Create and run evolution
from nextnanoevo import Evolution
evolution = Evolution(nextnanoio=nn_io, metric=metric, bounds=([1.0], [1.1]), size=5)
evolution.run(gen=4, algorithm_kwargs={"m": 0.4, "cr": 0.95, "seed": 2023}, seed=12345)
And print the final solution and fitness
for index, (sol, fit) in enumerate(
zip(evolution.pareto_solutions, evolution.pareto_fits)
):
print(f"{index}. Solution {sol}: {fit}")
This example is created to showcase how to use nextnanoevo to optimize the devices with nextnano.NEGF. To decrease the time of the simulations, the bounds are set to 0.9-1.1, and the number of generations is set to 3.
Result of optimization:
|
Gain at 270 meV (\(cm^{-1}\)) |
---|---|
1.0662883 |
324.4952 |
The resulting gain in the optimized QCL is shown in the figure below
Conclusion¶
This tutorial shows how to use the nextnanoevo to optimize the gain at the given photon energy of QCL. The optimized sttructure has a peak gain at the target wavelength after 5 generations of optimization.