ElectroMagneticPython 2.2.1__py3-none-any.whl → 2.2.4__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. EMpy/RCWA.py +32 -12
  2. EMpy/__init__.py +10 -2
  3. EMpy/_version.py +24 -0
  4. EMpy/constants.py +0 -2
  5. EMpy/devices.py +8 -32
  6. EMpy/materials.py +1 -8
  7. EMpy/modesolvers/FD.py +34 -76
  8. EMpy/modesolvers/FMM.py +24 -23
  9. EMpy/modesolvers/__init__.py +1 -0
  10. EMpy/modesolvers/geometries.py +8 -9
  11. EMpy/transfer_matrix.py +10 -6
  12. EMpy/utils.py +12 -26
  13. electromagneticpython-2.2.4.dist-info/METADATA +99 -0
  14. electromagneticpython-2.2.4.dist-info/RECORD +45 -0
  15. {ElectroMagneticPython-2.2.1.dist-info → electromagneticpython-2.2.4.dist-info}/WHEEL +1 -1
  16. electromagneticpython-2.2.4.dist-info/top_level.txt +4 -0
  17. examples/ex_APRR.py +18 -0
  18. examples/ex_NRR.py +40 -0
  19. examples/ex_RCWA.py +95 -0
  20. examples/ex_RCWA_2.py +52 -0
  21. examples/ex_RCWA_3.py +58 -0
  22. examples/ex_SRR.py +23 -0
  23. examples/ex_laser_etch_monitor.py +241 -0
  24. examples/ex_modesolver.py +68 -0
  25. examples/ex_modesolver_2.py +58 -0
  26. examples/ex_modesolver_3.py +48 -0
  27. examples/ex_modesolver_4.py +43 -0
  28. examples/ex_modesolver_dch.py +296 -0
  29. examples/ex_modesolver_dch_anis.py +318 -0
  30. examples/ex_transfer_matrix.py +82 -0
  31. examples/ex_transfer_matrix_2.py +44 -0
  32. examples/ex_transfer_matrix_2.py.png +0 -0
  33. examples/ex_transfer_matrix_3.py +60 -0
  34. examples/lc_data.dat +27 -0
  35. examples/nk.py +1468 -0
  36. scripts/FDTD.py +741 -0
  37. tests/devices_test.py +31 -0
  38. tests/materials_test.py +1 -1
  39. tests/modesolvers_test.py +36 -0
  40. tests/transfer_matrix_test.py +134 -0
  41. tests/utils_test.py +9 -5
  42. EMpy/version.py +0 -1
  43. ElectroMagneticPython-2.2.1.dist-info/METADATA +0 -109
  44. ElectroMagneticPython-2.2.1.dist-info/RECORD +0 -22
  45. ElectroMagneticPython-2.2.1.dist-info/top_level.txt +0 -2
  46. {ElectroMagneticPython-2.2.1.dist-info → electromagneticpython-2.2.4.dist-info/licenses}/LICENSE +0 -0
examples/nk.py ADDED
@@ -0,0 +1,1468 @@
1
+ # flake8: noqa
2
+ """
3
+ Database file of functions to return refractive indices of various materials.
4
+ This file, nk.py should be in same dir as script, or in the python path somewhere.
5
+
6
+ All wavelengths are in MICRONS
7
+
8
+ After importing,
9
+ call `help( nk )` to see usage info.
10
+ call `dir( nk )` to list defined materials
11
+ call `help( nk.Si )` to see info on specific material model
12
+
13
+
14
+
15
+ Materials may be called from another script like so:
16
+
17
+ import nk
18
+ # Return the refractive index of SiO2 at the given wavelength(s):
19
+ >>> nk.SiO(1.550)
20
+ : 1.448333
21
+
22
+ You can pass/return multiple wavelengths/indices. They must in a numpy.array (not [list]), as so:
23
+ >>> nk.SiO( numpy.array([1.550, 1.551, 1.552]) )
24
+ : array([ 1.4483336 , 1.44832036, 1.44830712])
25
+
26
+ -- OR --
27
+
28
+ core_material = nk.SiN # Despite appearances, these are functions, not variables!
29
+ core_material( 1.550 ) # will give index at that wavelength
30
+
31
+ # Return the refractive index for the Alloy Al(0.92)Ga(0.08)As @ 1.550 micron wavelength:
32
+ >>> nk.AlGaAs(0.92, 1.550)
33
+ : 2.93059
34
+
35
+
36
+ Complex Refractive indices, in the form (n + i*k), can be requested from certain materials via the `k=True` argument, as so:
37
+ >>> nk.GaSb( 0.632 , k=True)
38
+ : (4.9285209602676332-0.69616573380335467j)
39
+
40
+
41
+ Materials may be defined in this file like so:
42
+ >>> cauchy = lambda p ,x: p[0] + p[1]/x**2 + p[2]/x**4
43
+ where cauchy is a defined lambda (in-line) fitting function, and p can be passed as a
44
+ list/tuple of 3 values to set the constants in the equations.
45
+ For SiO2 with the Cauchy fitting params of A=1.4764, B=0.0229, C=-0.012346 (for wavelength in microns):
46
+ >>> SiO2 = lambda x: cauchy([ 1.4764 , 0.02299 , -0.012346 ], x) # note x is still a passed variable.
47
+ >>> SiO2( 1.550 ) # in microns! (as defined by fitting params, above)
48
+ : 1.4764000095691965
49
+
50
+ See the GaAs_interp & GaSb_interp functions for examples of how to interpolate directly from raw tabulated data,
51
+ which can be found online for various materials at websites like:
52
+ http://www.filmetrics.com/refractive-index-database
53
+ https://refractiveindex.info
54
+
55
+
56
+ Originally written by Dustin Kleckner, U.C. Santa Barbara, 2008
57
+ Demis D. John: 2009 added some Cauchy fits for SiO2, Ta2O5, SiN
58
+ 2012: Added some semiconductor alloys, such as GaAs, AlGaAs etc.
59
+ 2014: Migrated some lambda functions over to full def() functions,
60
+ so that they have docstrings & wavelength range warnings.
61
+ 2017: Added complex index (absorption) values to some functions via argument `k=True`.
62
+ Added interpolated data functions for GaAs & GaSb.
63
+
64
+
65
+ ######################################################
66
+ """
67
+
68
+ ###########################
69
+ """ Import some modules """
70
+ ###########################
71
+ import numpy as np # array math
72
+ import warnings # warn user if invalid parameter, but continue program
73
+
74
+ ##############################################
75
+ """ Refractive Index models """
76
+ ##############################################
77
+
78
+ lorentzian = (
79
+ lambda p, x: p[0]
80
+ + p[1] * x
81
+ + p[2] * 0.25 * p[3] ** 2 / ((x - p[4]) ** 2 + 0.25 * p[3] ** 2)
82
+ )
83
+ lorentzian.__doc__ = """ A Lorentzian on a linear background -- provides a much better fit than polynomial!"""
84
+
85
+ cauchy = lambda p, x: p[0] + p[1] / x**2 + p[2] / x**4
86
+ cauchy.__doc__ = """ 3-parameter lossless Cauchy fit, as used on the J.A.Woolam WVase Ellipsometer:"""
87
+
88
+
89
+ cauchy5 = lambda p, x: p[0] + p[1] / x**2 + p[2] / x**4 + p[3] / x**6 + p[4] / x**8
90
+ cauchy5.__doc__ = """ 5-parameter Cauchy fit """
91
+
92
+
93
+ cauchy2offset = lambda p, x: p[0] + p[1] / x**2 + p[2]
94
+ cauchy2offset.__doc__ = """ LiONiX (SiN): Cauchy model with birefringent offset
95
+ A + B/lambda^2 + C """
96
+
97
+
98
+ sellmeier = lambda p, x: np.sqrt(
99
+ p[0] + ((p[1] * x**2) / (x**2 - p[2] ** 2)) - p[3] * x**2
100
+ )
101
+ sellmeier.__doc__ = """ Sellmeier according to [1]
102
+ n^2 = offset + ((a*lambda^2)/(lambda^2 - b^2)) - c*lambda^2
103
+ where p[0], p[1], p[2], p[3] = offset, a, b, c respectively """
104
+
105
+
106
+ def sellmeier1(p, x):
107
+ """Sellmeier according to [2]: Mondry...Coldren: AlInGaAs on InP
108
+ n^2 = a + ( (b*lambda^2)/(lambda^2 - c^2) )
109
+ where p[0], p[1], p[2] = a, b, c respectively
110
+
111
+ Re-using `sellmeier()`, with C=0
112
+ """
113
+ return sellmeier((p[0], p[1], p[2], 0), x)
114
+
115
+
116
+ sellmeier5 = lambda p, x: np.sqrt(
117
+ p[0] + (p[1] * x**2 / (x**2 - p[2] ** 2)) + (p[3] * x**2 / (x**2 - p[4] ** 2))
118
+ )
119
+ sellmeier5.__doc__ = """ Sellmeier with 5 params -
120
+ #### CHECK THIS - maybe not good model - curvature doesn't look right
121
+ """
122
+
123
+
124
+ sellmeier7_1 = lambda p, x: np.sqrt(
125
+ 1
126
+ + p[0]
127
+ + (p[1] * x**2 / (x**2 - p[2] ** 2))
128
+ + (p[3] * x**2 / (x**2 - p[4] ** 2))
129
+ + (p[5] * x**2 / (x**2 - p[6] ** 2))
130
+ )
131
+ sellmeier7_1.__doc__ = """ Sellmeier with 7 params and '1+...' """
132
+
133
+
134
+ sellmeier8_1 = lambda p, x: np.sqrt(
135
+ 1
136
+ + (p[0] * x**2 / (x**2 - p[1] ** 2))
137
+ + (p[2] * x**2 / (x**2 - p[3] ** 2))
138
+ + (p[4] * x**2 / (x**2 - p[5] ** 2))
139
+ + (p[6] * x**2 / (x**2 - p[7] ** 2))
140
+ )
141
+ sellmeier8_1.__doc__ = """Sellmeier with 8 params and '1+...' """
142
+
143
+
144
+ def fillfraction(base, fill):
145
+ """Fill fraction, to reduce index of refraction"""
146
+
147
+ def f(x):
148
+ return (1.0 - fill) + fill * base(x)
149
+
150
+ return f
151
+
152
+
153
+ ##############################################
154
+ ## Other Utility Functions ##
155
+ # def wave(t, n):
156
+ # """
157
+ # return number of wavelengths (wavelength fraction), given
158
+ # t: thickness (um) &
159
+ # n: Refractive Index
160
+ # For example:
161
+ # Convert 10nm of InP to the wavelength-equivalent @ 1.410um:
162
+ # >>> wave( 0.010, n.InP(1.410) )
163
+ # """
164
+ # return t / (wl / n)
165
+
166
+
167
+ # def thick(wave, n):
168
+ # """
169
+ # return thickness given
170
+ # wave: wave-fraction
171
+ # n: Refractive index
172
+ # For example:
173
+ # Convert 1/2-wave of InP to the thickness-equivalent @ 1.410um:
174
+ # >>> wave( 0.5, n.InP(1.410) )
175
+ # """
176
+ # return wave * (wl / n)
177
+
178
+
179
+ ##################################################
180
+ ## Films: ##
181
+ ##################################################
182
+
183
+ ##################################################
184
+ ## Metals & Alloys ##
185
+ ##################################################
186
+
187
+
188
+ def Si(wl):
189
+ """
190
+ Calculate refractive index of Silicon at specified wavelength.
191
+ Valid from 0.400-1.200um
192
+
193
+ Silicon, from luxpop.com
194
+ Fit for 400-1200. RMS error: 9E-3
195
+ Error is more than others, maxing at around ~0.02
196
+ This is due to proximity of bandgap!
197
+ -- Dustin Kleckner, UCSB, ~2008
198
+
199
+ Args:
200
+ wl: wavelength in microns (float)
201
+ Returns:
202
+ Refractive index (float)
203
+ Raises:
204
+ Warning for wavelength out of model range
205
+
206
+ """
207
+ check_wl(wl, 0.400, 1.200, "Si")
208
+ return lorentzian([3.72152, -1.83137e-4, 2.33148e5, 8.73460e-1, 2.50691e2], wl)
209
+
210
+
211
+ # end def(Si)
212
+
213
+
214
+ def AlAs(wl):
215
+ """
216
+ Calculate refractive index of AlAs at specified wavelength.
217
+ Valid from 0.56~2.2um
218
+
219
+ http://refractiveindex.info/legacy/?group=CRYSTALS&material=AlAs&option=HO&wavelength=1.050
220
+
221
+ Handbook of Optics, 2nd edition, Vol. 2. McGraw-Hill 1994
222
+
223
+ Args:
224
+ wl: wavelength in microns (float)
225
+ Returns:
226
+ Refractive index (float)
227
+ Raises:
228
+ Warning for wavelength out of model range
229
+
230
+ """
231
+ check_wl(wl, 0.560, 2.300, "AlAs")
232
+ return sellmeier5((2.0792, 6.0840, 0.2822, 1.900, 27.62), wl)
233
+
234
+
235
+ def AlAs_interp(wl, k=False):
236
+ """
237
+ Calculate refractive index of GaAs at specified wavelength with optional loss (k) returned as complex index, interpolated from tabulated data.
238
+ Valid from 206~2480nm
239
+
240
+
241
+ Tabulated data from:
242
+ http://www.filmetrics.com/refractive-index-database/AlAs/Aluminium-Arsenide
243
+ M. Garriga, P. Lautenschlager, M. Cardona, and K. Ploog, Solid State Commun. 61, 157 (1987) (UV data) and S. Adachi, J. Appl. Phys. 58, R1 (1985) (Vis and NIR data)
244
+
245
+ Uses Numpy interpolation to return values - will raise error if requested wavelength is outside range.
246
+
247
+ Args:
248
+ wl: wavelength in microns (float)
249
+ k : {True | False}, optional
250
+ False by default. If True, returns complex refractive indices.
251
+ Returns:
252
+ Refractive index (float), complex if k=True
253
+ Raises:
254
+ Warning for wavelength out of model range
255
+
256
+ """
257
+ wl = np.atleast_1d(wl) # ensure arg is array
258
+
259
+ # raw data:
260
+ wls = 1e-3 * np.array(
261
+ [
262
+ 221.0,
263
+ 221.4300000000000068,
264
+ 223.4199999999999875,
265
+ 225.4499999999999886,
266
+ 227.5200000000000102,
267
+ 229.6299999999999955,
268
+ 231.7800000000000011,
269
+ 233.960000000000008,
270
+ 236.1899999999999977,
271
+ 238.460000000000008,
272
+ 240.7800000000000011,
273
+ 243.1399999999999864,
274
+ 245.539999999999992,
275
+ 248.0,
276
+ 250.5099999999999909,
277
+ 253.0600000000000023,
278
+ 255.6699999999999875,
279
+ 258.3299999999999841,
280
+ 261.0500000000000114,
281
+ 263.8299999999999841,
282
+ 266.6700000000000159,
283
+ 269.5699999999999932,
284
+ 272.5299999999999727,
285
+ 275.5600000000000023,
286
+ 278.6499999999999773,
287
+ 281.8199999999999932,
288
+ 285.0600000000000023,
289
+ 288.3700000000000045,
290
+ 291.7599999999999909,
291
+ 295.2400000000000091,
292
+ 298.8000000000000114,
293
+ 302.4399999999999977,
294
+ 306.1700000000000159,
295
+ 310.0,
296
+ 313.9200000000000159,
297
+ 317.9499999999999886,
298
+ 322.0799999999999841,
299
+ 326.3199999999999932,
300
+ 330.6700000000000159,
301
+ 335.1399999999999864,
302
+ 339.7300000000000182,
303
+ 344.4399999999999977,
304
+ 349.3000000000000114,
305
+ 354.2900000000000205,
306
+ 359.4200000000000159,
307
+ 364.7099999999999795,
308
+ 370.1499999999999773,
309
+ 375.7599999999999909,
310
+ 381.5400000000000205,
311
+ 387.5,
312
+ 393.6499999999999773,
313
+ 400.0,
314
+ 406.5600000000000023,
315
+ 413.3299999999999841,
316
+ 420.339999999999975,
317
+ 427.589999999999975,
318
+ 435.089999999999975,
319
+ 442.8600000000000136,
320
+ 450.910000000000025,
321
+ 459.2599999999999909,
322
+ 467.9200000000000159,
323
+ 476.9200000000000159,
324
+ 486.2699999999999818,
325
+ 496.0,
326
+ 506.1200000000000045,
327
+ 516.6699999999999591,
328
+ 527.6599999999999682,
329
+ 539.1299999999999955,
330
+ 551.1100000000000136,
331
+ 563.6399999999999864,
332
+ 576.7400000000000091,
333
+ 590.4800000000000182,
334
+ 604.8799999999999955,
335
+ 620.0,
336
+ 635.8999999999999773,
337
+ 652.6299999999999955,
338
+ 670.2699999999999818,
339
+ 688.8899999999999864,
340
+ 708.57000000000005,
341
+ 729.4099999999999682,
342
+ 751.5199999999999818,
343
+ 775.0,
344
+ 800.0,
345
+ 826.6699999999999591,
346
+ 855.1699999999999591,
347
+ 885.7100000000000364,
348
+ 918.5199999999999818,
349
+ 953.8500000000000227,
350
+ 992.0,
351
+ 1033.3299999999999272,
352
+ 1078.2599999999999909,
353
+ 1127.2699999999999818,
354
+ 1180.9500000000000455,
355
+ 1240.0,
356
+ 1305.2599999999999909,
357
+ 1377.7799999999999727,
358
+ 1458.8199999999999363,
359
+ 1550.0,
360
+ 1653.3299999999999272,
361
+ 1771.4300000000000637,
362
+ 1907.6900000000000546,
363
+ 2066.6700000000000728,
364
+ 2254.5500000000001819,
365
+ 2480.0,
366
+ ]
367
+ )
368
+
369
+ check_wl(wl, np.min(wls), np.max(wls), "AlAs_interp")
370
+
371
+ ns = np.array(
372
+ [
373
+ 1.3209299999999999,
374
+ 1.3600000000000001,
375
+ 1.3706,
376
+ 1.3600000000000001,
377
+ 1.3493999999999999,
378
+ 1.3600000000000001,
379
+ 1.4299999999999999,
380
+ 1.53,
381
+ 1.6363000000000001,
382
+ 1.77,
383
+ 1.96,
384
+ 2.1600000000000001,
385
+ 2.3169,
386
+ 2.48,
387
+ 2.6850000000000001,
388
+ 2.9199999999999999,
389
+ 3.1974999999999998,
390
+ 3.48,
391
+ 3.7387999999999999,
392
+ 3.96,
393
+ 4.1224999999999996,
394
+ 4.2199999999999998,
395
+ 4.2249999999999996,
396
+ 4.1799999999999997,
397
+ 4.1093999999999999,
398
+ 4.04,
399
+ 4.0099999999999998,
400
+ 4.0099999999999998,
401
+ 4.0355999999999996,
402
+ 4.1100000000000003,
403
+ 4.2680999999999996,
404
+ 4.4699999999999998,
405
+ 4.6905999999999999,
406
+ 4.9199999999999999,
407
+ 5.1605999999999996,
408
+ 5.3499999999999996,
409
+ 5.4218999999999999,
410
+ 5.3899999999999997,
411
+ 5.2093999999999996,
412
+ 4.9900000000000002,
413
+ 4.8449999999999998,
414
+ 4.7199999999999998,
415
+ 4.5944000000000003,
416
+ 4.4800000000000004,
417
+ 4.3856000000000002,
418
+ 4.2999999999999998,
419
+ 4.2163000000000004,
420
+ 4.1299999999999999,
421
+ 4.0293999999999999,
422
+ 3.9300000000000002,
423
+ 3.8450000000000002,
424
+ 3.77,
425
+ 3.7052,
426
+ 3.6493000000000002,
427
+ 3.6013000000000002,
428
+ 3.5602999999999998,
429
+ 3.5253000000000001,
430
+ 3.4954999999999998,
431
+ 3.4699,
432
+ 3.4474999999999998,
433
+ 3.4274,
434
+ 3.4087999999999998,
435
+ 3.3904999999999998,
436
+ 3.3717999999999999,
437
+ 3.3515999999999999,
438
+ 3.3290000000000002,
439
+ 3.3012999999999999,
440
+ 3.2730000000000001,
441
+ 3.2481,
442
+ 3.2250000000000001,
443
+ 3.2033999999999998,
444
+ 3.1829999999999998,
445
+ 3.1634000000000002,
446
+ 3.145,
447
+ 3.1280000000000001,
448
+ 3.1120000000000001,
449
+ 3.0966,
450
+ 3.0819999999999999,
451
+ 3.0686,
452
+ 3.056,
453
+ 3.0438000000000001,
454
+ 3.032,
455
+ 3.0207999999999999,
456
+ 3.0099999999999998,
457
+ 2.9996999999999998,
458
+ 2.9900000000000002,
459
+ 2.9813000000000001,
460
+ 2.9729999999999999,
461
+ 2.9647999999999999,
462
+ 2.9569999999999999,
463
+ 2.9498000000000002,
464
+ 2.9430000000000001,
465
+ 2.9363000000000001,
466
+ 2.9300000000000002,
467
+ 2.9243000000000001,
468
+ 2.919,
469
+ 2.9138000000000002,
470
+ 2.9089999999999998,
471
+ 2.9047999999999998,
472
+ 2.9009999999999998,
473
+ 2.8974000000000002,
474
+ 2.8940000000000001,
475
+ 2.8908999999999998,
476
+ 2.8879999999999999,
477
+ ]
478
+ )
479
+
480
+ ks = np.array(
481
+ [
482
+ 2.4303080000000001e00,
483
+ 2.7500000000000000e00,
484
+ 2.8062999999999998e00,
485
+ 2.8900000000000001e00,
486
+ 2.9963000000000002e00,
487
+ 3.1200000000000001e00,
488
+ 3.2587999999999999e00,
489
+ 3.3999999999999999e00,
490
+ 3.5293999999999999e00,
491
+ 3.6499999999999999e00,
492
+ 3.7650000000000001e00,
493
+ 3.8599999999999999e00,
494
+ 3.9125000000000001e00,
495
+ 3.9500000000000002e00,
496
+ 4.0019000000000000e00,
497
+ 4.0400000000000000e00,
498
+ 4.0556000000000001e00,
499
+ 4.0199999999999996e00,
500
+ 3.8969000000000000e00,
501
+ 3.7000000000000002e00,
502
+ 3.4037999999999999e00,
503
+ 3.0899999999999999e00,
504
+ 2.8288000000000002e00,
505
+ 2.6299999999999999e00,
506
+ 2.5463000000000000e00,
507
+ 2.5200000000000000e00,
508
+ 2.5063000000000000e00,
509
+ 2.5200000000000000e00,
510
+ 2.5718999999999999e00,
511
+ 2.6299999999999999e00,
512
+ 2.6738000000000000e00,
513
+ 2.6800000000000002e00,
514
+ 2.6093999999999999e00,
515
+ 2.4900000000000002e00,
516
+ 2.3613000000000000e00,
517
+ 2.1499999999999999e00,
518
+ 1.7380000000000000e00,
519
+ 1.3000000000000000e00,
520
+ 9.8740000000000006e-01,
521
+ 7.5200000000000000e-01,
522
+ 6.1280000000000001e-01,
523
+ 5.1900000000000002e-01,
524
+ 4.1830000000000001e-01,
525
+ 3.3400000000000002e-01,
526
+ 2.7779999999999999e-01,
527
+ 2.3300000000000001e-01,
528
+ 1.8120000000000000e-01,
529
+ 1.3900000000000001e-01,
530
+ 1.2130000000000001e-01,
531
+ 1.1500000000000000e-01,
532
+ 1.1320000000000000e-01,
533
+ 1.1300000000000000e-01,
534
+ 1.1070000000000001e-01,
535
+ 1.0240000000000000e-01,
536
+ 8.0399999999999999e-02,
537
+ 5.2999999999999999e-02,
538
+ 2.3400000000000001e-02,
539
+ 0.0000000000000000e00,
540
+ 3.3000000000000000e-03,
541
+ 0.0000000000000000e00,
542
+ 0.0000000000000000e00,
543
+ 0.0000000000000000e00,
544
+ 0.0000000000000000e00,
545
+ 0.0000000000000000e00,
546
+ 0.0000000000000000e00,
547
+ 0.0000000000000000e00,
548
+ 0.0000000000000000e00,
549
+ 0.0000000000000000e00,
550
+ 0.0000000000000000e00,
551
+ 0.0000000000000000e00,
552
+ 0.0000000000000000e00,
553
+ 0.0000000000000000e00,
554
+ 0.0000000000000000e00,
555
+ 0.0000000000000000e00,
556
+ 0.0000000000000000e00,
557
+ 0.0000000000000000e00,
558
+ 0.0000000000000000e00,
559
+ 0.0000000000000000e00,
560
+ 0.0000000000000000e00,
561
+ 0.0000000000000000e00,
562
+ 0.0000000000000000e00,
563
+ 0.0000000000000000e00,
564
+ 0.0000000000000000e00,
565
+ 0.0000000000000000e00,
566
+ 0.0000000000000000e00,
567
+ 0.0000000000000000e00,
568
+ 0.0000000000000000e00,
569
+ 0.0000000000000000e00,
570
+ 0.0000000000000000e00,
571
+ 0.0000000000000000e00,
572
+ 0.0000000000000000e00,
573
+ 0.0000000000000000e00,
574
+ 0.0000000000000000e00,
575
+ 0.0000000000000000e00,
576
+ 0.0000000000000000e00,
577
+ 0.0000000000000000e00,
578
+ 0.0000000000000000e00,
579
+ 0.0000000000000000e00,
580
+ 0.0000000000000000e00,
581
+ 0.0000000000000000e00,
582
+ 0.0000000000000000e00,
583
+ 0.0000000000000000e00,
584
+ 0.0000000000000000e00,
585
+ 0.0000000000000000e00,
586
+ ]
587
+ )
588
+
589
+ ns = np.interp(wl, wls, ns)
590
+ ks = np.interp(wl, wls, ks)
591
+ if k:
592
+ return ns - 1j * ks
593
+ else:
594
+ return ns
595
+
596
+
597
+ # end def(AlAs_interp)
598
+
599
+
600
+ def GaAs(wl):
601
+ """
602
+ Calculate refractive index of GaAs at specified wavelength for mid-Infra-Red
603
+ Valid from 1.4~11um
604
+
605
+ http://refractiveindex.info/legacy/?group=CRYSTALS&material=GaAs
606
+
607
+ Handbook of optics, 3rd ed., Vol. 4, mcgraw hill 2009
608
+
609
+ Args:
610
+ wl: wavelength in microns (float)
611
+ Returns:
612
+ Refractive index (float)
613
+ Raises:
614
+ Warning for wavelength out of model range
615
+
616
+ """
617
+ check_wl(wl, 1.400, 12.0, "GaAs_mIR")
618
+ return sellmeier5((3.5, 7.4969, 0.4082, 1.9347, 37.17), wl)
619
+
620
+
621
+ # end def(GaAs_mIR)
622
+
623
+
624
+ def GaAs_mIR(wl):
625
+ """
626
+ Calculate refractive index of GaAs at specified wavelength.
627
+ Valid from 0.97~17 um
628
+
629
+ http://refractiveindex.info/?shelf=main&book=GaAs&page=Skauli
630
+
631
+ T. Skauli, P. S. Kuo, K. L. Vodopyanov, T. J. Pinguet, O. Levi, L. A. Eyres, J. S. Harris, M. M. Fejer, B. Gerard, L. Becouarn, and E. Lallier. Improved dispersion relations for GaAs and applications to nonlinear optics, J. Appl. Phys., 94, 6447-6455 (2003)
632
+
633
+ Args:
634
+ wl: wavelength in microns (float)
635
+ Returns:
636
+ Refractive index (float)
637
+ Raises:
638
+ Warning for wavelength out of model range
639
+
640
+ """
641
+ check_wl(wl, 0.970, 17.50, "GaAs")
642
+ return sellmeier7_1(
643
+ (4.372514, 5.466742, 0.4431307, 0.02429960, 0.8746453, 1.957522, 36.9166), wl
644
+ )
645
+
646
+
647
+ # end def(GaAs)
648
+ # Should conditionally switch to mIR model depending on passed WL...
649
+
650
+
651
+ def GaAs_interp(wl, k=False):
652
+ """
653
+ Calculate refractive index of GaAs at specified wavelength with optional loss (k) returned as complex index, interpolated from tabulated data.
654
+ Valid from 206~2066nm
655
+
656
+
657
+ Tabulated data from:
658
+ http://www.filmetrics.com/refractive-index-database/GaAs/Gallium-Arsenide
659
+ Reference: J. B. Theeten, D. E. Aspnes, and R. P. H. Chang, J. Appl. Phys. 49, 6097 (1978)
660
+
661
+ Uses Numpy interpolation to return values - will raise error if requested wavelength is outside range.
662
+
663
+ Args:
664
+ wl: wavelength in microns (float)
665
+ k : {True | False}, optional
666
+ False by default. If True, returns complex refractive indices.
667
+ Returns:
668
+ Refractive index (float), complex if k=True
669
+ Raises:
670
+ Warning for wavelength out of model range
671
+
672
+ """
673
+ wl = np.atleast_1d(wl) # ensure arg is array
674
+
675
+ # raw data:
676
+ wls = 1e-3 * np.array(
677
+ [
678
+ 206.6299999999999955,
679
+ 210.1399999999999864,
680
+ 213.7599999999999909,
681
+ 217.5099999999999909,
682
+ 221.3899999999999864,
683
+ 225.4199999999999875,
684
+ 229.5900000000000034,
685
+ 233.9199999999999875,
686
+ 238.4199999999999875,
687
+ 243.0999999999999943,
688
+ 247.960000000000008,
689
+ 253.0200000000000102,
690
+ 258.2900000000000205,
691
+ 263.7900000000000205,
692
+ 269.5199999999999818,
693
+ 275.5099999999999909,
694
+ 281.7699999999999818,
695
+ 288.3299999999999841,
696
+ 295.1899999999999977,
697
+ 302.3899999999999864,
698
+ 309.9499999999999886,
699
+ 317.8999999999999773,
700
+ 326.2599999999999909,
701
+ 335.0799999999999841,
702
+ 344.3899999999999864,
703
+ 354.2300000000000182,
704
+ 364.6499999999999773,
705
+ 375.6999999999999886,
706
+ 387.4399999999999977,
707
+ 399.9399999999999977,
708
+ 413.2699999999999818,
709
+ 427.5199999999999818,
710
+ 442.7900000000000205,
711
+ 459.1899999999999977,
712
+ 476.8500000000000227,
713
+ 495.9200000000000159,
714
+ 516.5800000000000409,
715
+ 539.0399999999999636,
716
+ 563.5499999999999545,
717
+ 590.3799999999999955,
718
+ 619.8999999999999773,
719
+ 652.5299999999999727,
720
+ 688.7799999999999727,
721
+ 729.2899999999999636,
722
+ 774.8700000000000045,
723
+ 826.5299999999999727,
724
+ 885.57000000000005,
725
+ 953.6900000000000546,
726
+ 1033.1700000000000728,
727
+ 1127.0899999999999181,
728
+ 1239.7999999999999545,
729
+ 1377.5599999999999454,
730
+ 1549.75,
731
+ 1771.1400000000001,
732
+ 2066.3299999999999272,
733
+ ]
734
+ )
735
+
736
+ check_wl(wl, np.min(wls), np.max(wls), "GaAs_interp")
737
+
738
+ ns = np.array(
739
+ [
740
+ 1.264,
741
+ 1.288,
742
+ 1.3109999999999999,
743
+ 1.325,
744
+ 1.349,
745
+ 1.383,
746
+ 1.4299999999999999,
747
+ 1.4990000000000001,
748
+ 1.599,
749
+ 1.802,
750
+ 2.2730000000000001,
751
+ 2.8900000000000001,
752
+ 3.3420000000000001,
753
+ 3.5979999999999999,
754
+ 3.7690000000000001,
755
+ 3.9129999999999998,
756
+ 4.0149999999999997,
757
+ 3.9390000000000001,
758
+ 3.8100000000000001,
759
+ 3.6920000000000002,
760
+ 3.601,
761
+ 3.5379999999999998,
762
+ 3.5009999999999999,
763
+ 3.4849999999999999,
764
+ 3.4950000000000001,
765
+ 3.5310000000000001,
766
+ 3.5960000000000001,
767
+ 3.7090000000000001,
768
+ 3.9380000000000002,
769
+ 4.3730000000000002,
770
+ 4.5090000000000003,
771
+ 5.0519999999999996,
772
+ 4.9589999999999996,
773
+ 4.694,
774
+ 4.492,
775
+ 4.3330000000000002,
776
+ 4.2050000000000001,
777
+ 4.0999999999999996,
778
+ 4.0129999999999999,
779
+ 3.9399999999999999,
780
+ 3.8780000000000001,
781
+ 3.8260000000000001,
782
+ 3.7850000000000001,
783
+ 3.742,
784
+ 3.7000000000000002,
785
+ 3.6659999999999999,
786
+ 3.6139999999999999,
787
+ 3.5388000000000002,
788
+ 3.492,
789
+ 3.4546000000000001,
790
+ 3.4232,
791
+ 3.3965000000000001,
792
+ 3.3736999999999999,
793
+ 3.3542999999999998,
794
+ 3.3378000000000001,
795
+ ]
796
+ )
797
+
798
+ ks = np.array(
799
+ [
800
+ 2.4720000000000000e00,
801
+ 2.5569999999999999e00,
802
+ 2.6250000000000000e00,
803
+ 2.7100000000000000e00,
804
+ 2.8149999999999999e00,
805
+ 2.9359999999999999e00,
806
+ 3.0790000000000002e00,
807
+ 3.2549999999999999e00,
808
+ 3.4840000000000000e00,
809
+ 3.7949999999999999e00,
810
+ 4.0839999999999996e00,
811
+ 4.0469999999999997e00,
812
+ 3.7700000000000000e00,
813
+ 3.4520000000000000e00,
814
+ 3.1690000000000000e00,
815
+ 2.9190000000000000e00,
816
+ 2.5630000000000002e00,
817
+ 2.2599999999999998e00,
818
+ 2.0690000000000000e00,
819
+ 1.9690000000000001e00,
820
+ 1.9199999999999999e00,
821
+ 1.9039999999999999e00,
822
+ 1.9090000000000000e00,
823
+ 1.9310000000000000e00,
824
+ 1.9650000000000001e00,
825
+ 2.0129999999999999e00,
826
+ 2.0760000000000001e00,
827
+ 2.1619999999999999e00,
828
+ 2.2879999999999998e00,
829
+ 2.1459999999999999e00,
830
+ 1.9480000000000000e00,
831
+ 1.7210000000000001e00,
832
+ 9.9099999999999999e-01,
833
+ 6.9599999999999995e-01,
834
+ 5.3900000000000003e-01,
835
+ 4.4100000000000000e-01,
836
+ 3.7100000000000000e-01,
837
+ 3.2000000000000001e-01,
838
+ 2.7600000000000002e-01,
839
+ 2.3999999999999999e-01,
840
+ 2.1099999999999999e-01,
841
+ 1.7899999999999999e-01,
842
+ 1.5100000000000000e-01,
843
+ 1.1200000000000000e-01,
844
+ 9.0999999999999998e-02,
845
+ 8.0000000000000002e-02,
846
+ 1.6999999999999999e-03,
847
+ 0.0000000000000000e00,
848
+ 0.0000000000000000e00,
849
+ 0.0000000000000000e00,
850
+ 0.0000000000000000e00,
851
+ 0.0000000000000000e00,
852
+ 0.0000000000000000e00,
853
+ 0.0000000000000000e00,
854
+ 0.0000000000000000e00,
855
+ ]
856
+ )
857
+
858
+ ns = np.interp(wl, wls, ns)
859
+ ks = np.interp(wl, wls, ks)
860
+ if k:
861
+ return ns - 1j * ks
862
+ else:
863
+ return ns
864
+
865
+
866
+ # end def(GaAs_interp)
867
+
868
+
869
+ def GaSb_interp(wl, k=False):
870
+ """
871
+ Calculate refractive index (complex) of GaSb at specified wavelength.
872
+ Valid from from 206.6 nm to 826.6 nm. Interpolation of raw tabulated data.
873
+
874
+ https://refractiveindex.info/?shelf=main&book=GaSb&page=Aspnes
875
+
876
+ D. E. Aspnes and A. A. Studna. Dielectric functions and optical parameters of Si, Ge, GaP, GaAs, GaSb, InP, InAs, and InSb from 1.5 to 6.0 eV, Phys. Rev. B, 27, 985-1009 (1983)
877
+ https://doi.org/10.1103/PhysRevB.27.985
878
+
879
+
880
+
881
+ Args:
882
+ wl: wavelength in microns (float)
883
+ k : {True | False}, optional
884
+ False by default. If True, returns complex refractive indices.
885
+ Returns:
886
+ Refractive index (float), complex if k=True
887
+ Raises:
888
+ Warning for wavelength out of model range
889
+
890
+ """
891
+ wl = np.atleast_1d(wl) # ensure arg is array
892
+
893
+ # raw data:
894
+ wls = np.array(
895
+ [
896
+ 0.2066,
897
+ 0.2101,
898
+ 0.2138,
899
+ 0.2175,
900
+ 0.2214,
901
+ 0.2254,
902
+ 0.2296,
903
+ 0.2339,
904
+ 0.2384,
905
+ 0.2431,
906
+ 0.248,
907
+ 0.253,
908
+ 0.2583,
909
+ 0.2638,
910
+ 0.2695,
911
+ 0.2755,
912
+ 0.2818,
913
+ 0.2883,
914
+ 0.2952,
915
+ 0.3024,
916
+ 0.31,
917
+ 0.3179,
918
+ 0.3263,
919
+ 0.3351,
920
+ 0.3444,
921
+ 0.3542,
922
+ 0.3647,
923
+ 0.3757,
924
+ 0.3875,
925
+ 0.3999,
926
+ 0.4133,
927
+ 0.4275,
928
+ 0.4428,
929
+ 0.4592,
930
+ 0.4769,
931
+ 0.4959,
932
+ 0.5165999999999999,
933
+ 0.5391,
934
+ 0.5636,
935
+ 0.5904,
936
+ 0.6199,
937
+ 0.6525,
938
+ 0.6888,
939
+ 0.7292999999999999,
940
+ 0.7749,
941
+ 0.8266,
942
+ ]
943
+ )
944
+
945
+ check_wl(wl, np.min(wls), np.max(wls), "GaSb_interp")
946
+
947
+ ns = np.array(
948
+ [
949
+ 0.9350000000000001,
950
+ 0.985,
951
+ 1.022,
952
+ 1.0620000000000001,
953
+ 1.127,
954
+ 1.212,
955
+ 1.2989999999999999,
956
+ 1.345,
957
+ 1.3560000000000001,
958
+ 1.3580000000000001,
959
+ 1.369,
960
+ 1.387,
961
+ 1.4079999999999999,
962
+ 1.444,
963
+ 1.5029999999999999,
964
+ 1.5860000000000001,
965
+ 1.7230000000000001,
966
+ 1.9890000000000001,
967
+ 2.5219999999999998,
968
+ 3.1000000000000001,
969
+ 3.4500000000000002,
970
+ 3.6200000000000001,
971
+ 3.7010000000000001,
972
+ 3.7480000000000002,
973
+ 3.774,
974
+ 3.7850000000000001,
975
+ 3.794,
976
+ 3.8079999999999998,
977
+ 3.7999999999999998,
978
+ 3.766,
979
+ 3.7320000000000002,
980
+ 3.7280000000000002,
981
+ 3.7599999999999998,
982
+ 3.8359999999999999,
983
+ 3.984,
984
+ 4.3120000000000003,
985
+ 4.5129999999999999,
986
+ 4.492,
987
+ 4.5209999999999999,
988
+ 4.7050000000000001,
989
+ 5.2389999999999999,
990
+ 5.0519999999999996,
991
+ 4.8170000000000002,
992
+ 4.6429999999999998,
993
+ 4.5069999999999997,
994
+ 4.3879999999999999,
995
+ ]
996
+ )
997
+
998
+ ks = np.array(
999
+ [
1000
+ 2.4159999999999999,
1001
+ 2.444,
1002
+ 2.4790000000000001,
1003
+ 2.5350000000000001,
1004
+ 2.6019999999999999,
1005
+ 2.645,
1006
+ 2.653,
1007
+ 2.6379999999999999,
1008
+ 2.645,
1009
+ 2.6850000000000001,
1010
+ 2.7509999999999999,
1011
+ 2.8290000000000002,
1012
+ 2.9279999999999999,
1013
+ 3.0550000000000002,
1014
+ 3.2080000000000002,
1015
+ 3.3919999999999999,
1016
+ 3.6280000000000001,
1017
+ 3.923,
1018
+ 4.1299999999999999,
1019
+ 3.976,
1020
+ 3.6429999999999998,
1021
+ 3.323,
1022
+ 3.069,
1023
+ 2.8620000000000001,
1024
+ 2.6899999999999999,
1025
+ 2.5449999999999999,
1026
+ 2.4300000000000002,
1027
+ 2.319,
1028
+ 2.21,
1029
+ 2.1339999999999999,
1030
+ 2.109,
1031
+ 2.121,
1032
+ 2.157,
1033
+ 2.2109999999999999,
1034
+ 2.2799999999999998,
1035
+ 2.2850000000000001,
1036
+ 1.962,
1037
+ 1.7889999999999999,
1038
+ 1.7470000000000001,
1039
+ 1.8029999999999999,
1040
+ 1.3779999999999999,
1041
+ 0.829,
1042
+ 0.611,
1043
+ 0.485,
1044
+ 0.416,
1045
+ 0.344,
1046
+ ]
1047
+ )
1048
+
1049
+ ns = np.interp(wl, wls, ns)
1050
+ ks = np.interp(wl, wls, ks)
1051
+ if k:
1052
+ return ns - 1j * ks
1053
+ else:
1054
+ return ns
1055
+
1056
+
1057
+ # end def(GaSb_interp)
1058
+
1059
+
1060
+ def InAs_fIR(wl):
1061
+ """
1062
+ Calculate refractive index of InAs at specified wavelength for far-infra-red
1063
+ Valid from 3.7-31.3 um
1064
+
1065
+ http://refractiveindex.info/legacy/?group=CRYSTALS&material=InAs
1066
+
1067
+ Handbook of Optics, 2nd edition, Vol. 2. McGraw-Hill 1994
1068
+
1069
+ Args:
1070
+ wl: wavelength in microns (float)
1071
+ Returns:
1072
+ Refractive index (float)
1073
+ Raises:
1074
+ Warning for wavelength out of model range
1075
+
1076
+ """
1077
+ check_wl(wl, 3.70, 31.30, "InAs_fIR")
1078
+ return sellmeier5((11.10, 0.71, 2.551, 2.75, 45.66), wl)
1079
+
1080
+
1081
+ # end def(InAs_fIR)
1082
+
1083
+
1084
+ def InAs(wl):
1085
+ """
1086
+ Calculate refractive index of InAs at specified wavelength for far-infra-red
1087
+ Valid from from 0.5299 um to 1.907 um
1088
+
1089
+ http://www.filmetrics.com/refractive-index-database/InAs/Indium-Arsenide
1090
+
1091
+ Downloaded data file with index values from 0.200-2.0um, and did a Cauchy Fit from 0.530 to 1.9um
1092
+ Cauchy params: A=3.47230, B=0.0876377, C=0.0457569
1093
+
1094
+ Args:
1095
+ wl: wavelength in microns (float)
1096
+ Returns:
1097
+ Refractive index (float)
1098
+ Raises:
1099
+ Warning for wavelength out of model range
1100
+
1101
+ """
1102
+ check_wl(wl, 0.5299, 1.907, "InAs")
1103
+ return cauchy((3.47230, 0.0876377, 0.0457569), wl)
1104
+
1105
+
1106
+ # end def(InAs)
1107
+
1108
+
1109
+ def InP(wl):
1110
+ """
1111
+ Calculate refractive index of InP.
1112
+ Valid from from 0.950 um to ~10 um
1113
+
1114
+ http://refractiveindex.info/legacy/?group=CRYSTALS&material=InP
1115
+
1116
+ Handbook of Optics, 2nd edition, Vol. 2. McGraw-Hill 1994
1117
+
1118
+ Args:
1119
+ wl: wavelength in microns (float)
1120
+ Returns:
1121
+ Refractive index (float)
1122
+ Raises:
1123
+ Warning for wavelength out of model range
1124
+
1125
+ """
1126
+ check_wl(wl, 0.950, 10.50, "InP")
1127
+ return sellmeier5((7.255, 2.316, 0.6263, 2.765, 32.935), wl)
1128
+
1129
+
1130
+ # end def(InP)
1131
+
1132
+
1133
+ def GaP(wl):
1134
+ """
1135
+ Calculate refractive index of GaP at specified wavelength.
1136
+ Valid from from 0.800 um to ~10 um
1137
+
1138
+ http://refractiveindex.info/legacy/?group=CRYSTALS&material=InP
1139
+
1140
+ Handbook of Optics, 2nd edition, Vol. 2. McGraw-Hill 1994
1141
+
1142
+ Args:
1143
+ wl: wavelength in microns (float)
1144
+ Returns:
1145
+ Refractive index (float)
1146
+ Raises:
1147
+ Warning for wavelength out of model range
1148
+
1149
+ """
1150
+ check_wl(wl, 0.800, 10.50, "GaP")
1151
+ # wlmin = 0.800
1152
+ # wlmax = 10.50
1153
+ return sellmeier8_1((1.390, 0.172, 4.131, 0.234, 2.570, 0.345, 2.056, 27.52), wl)
1154
+
1155
+
1156
+ # end def(GaP)
1157
+
1158
+
1159
+ #######################
1160
+ ### Ternary Alloys ###
1161
+
1162
+
1163
+ def AlGaAs(x, wl):
1164
+ """
1165
+ Returns the refractive index of Al(x)Ga(1-x)As at the specified wavelength, wl (in microns) and Aluminum content (x=0.0-1.0).
1166
+ Valid for 0.970 - 2.2 um
1167
+
1168
+ Calc'd by linear interpolation between AlAs() & GaAs().
1169
+
1170
+ Args:
1171
+ x: mole ratio of Al, as in: Al(x) Ga(1-x) As
1172
+ wl: wavelength in microns (float)
1173
+ Returns:
1174
+ Refractive index (float)
1175
+ Raises:
1176
+ Warning for wavelength out of model range
1177
+ """
1178
+ check_wl(wl, 0.970, 2.20, "AlGaAs")
1179
+ return GaAs(wl) - (GaAs(wl) - AlAs(wl)) * x
1180
+
1181
+
1182
+ # end def(AlGaAs)
1183
+
1184
+
1185
+ def AlGaAs_interp(x, wl, k=False):
1186
+ """
1187
+ Returns the refractive index of Al(x)Ga(1-x)As at the specified wavelength, wl (in microns) and Aluminum content (x=0.0-1.0).
1188
+ Returns complex value (including loss, k) if k==True.
1189
+ Uses interpolated GaAs_interp() & AlAs_interp().
1190
+
1191
+ Valid for wavelengths 0.206 - 2.066 um
1192
+ AlAs_interp: 0.206-2.480nm
1193
+ GaAs_interp: 0.206-2.066nm
1194
+
1195
+ Calc'd by linear interpolation between AlAs() & GaAs().
1196
+
1197
+ Args:
1198
+ x: mole ratio of Al, as in: Al(x) Ga(1-x) As
1199
+ wl: wavelength in microns (float)
1200
+ Returns:
1201
+ Refractive index (float)
1202
+ Raises:
1203
+ Exception ValueError for wavelength out of model range
1204
+ """
1205
+ check_wl(wl, 0.206, 2.066, "AlGaAs_interp", fail=True)
1206
+ if k:
1207
+ GaAs = GaAs_interp(wl, k=True)
1208
+ AlAs = AlAs_interp(wl, k=True)
1209
+ return GaAs - (GaAs - AlAs) * x
1210
+ else:
1211
+ return GaAs_interp(wl) - (GaAs_interp(wl) - AlAs_interp(wl)) * x
1212
+
1213
+
1214
+ # end def(AlGaAs)
1215
+
1216
+
1217
+ def InGaAs(x, wl):
1218
+ """
1219
+ Returns the index of In(1-x)Ga(x)As at the specified wavelength, wl (in microns) and Gallium content (x=0.0-1.0).
1220
+ Valid for 0.970 - 1.907 um.
1221
+
1222
+ Calc'd by linear interpolation between InAs() & GaAs().
1223
+
1224
+ Args:
1225
+ x: mole ratio of Gallium, as in: Ga(x) In(1-x) As
1226
+ wl: wavelength in microns (float)
1227
+ Returns:
1228
+ Refractive index (float)
1229
+ Raises:
1230
+ Warning for wavelength out of model range
1231
+ """
1232
+ check_wl(wl, 0.970, 1.907, "InGaAs")
1233
+ # wlmin = 0.970
1234
+ # wlmax = 1.907
1235
+ return GaAs(wl) - (GaAs(wl) - InAs(wl)) * x
1236
+
1237
+
1238
+ # end def(InGaAs)
1239
+
1240
+
1241
+ def InGaP(x, wl):
1242
+ """
1243
+ Returns the index of In(x)Ga(1-x)P at the specified wavelength, wl (in microns) and Gallium content (x=0.0-1.0).
1244
+ Valid for 0.950 - 1.907 um.
1245
+
1246
+ Calc'd by linear interpolation between InP() & GaP().
1247
+ Args:
1248
+ x: mole ratio of Indium, as in: In(x) Ga(1-x) P
1249
+ wl: wavelength in microns (float)
1250
+ Returns:
1251
+ Refractive index (float)
1252
+ Raises:
1253
+ Warning for wavelength out of model range
1254
+ """
1255
+ check_wl(wl, 0.950, 1.907, "InGaP")
1256
+ return InP(wl) - (InP(wl) - GaP(wl)) * x
1257
+
1258
+
1259
+ # end def(InGaAs)
1260
+
1261
+
1262
+ def GaAsP(x, wl):
1263
+ """
1264
+ Returns the refractive index of Ga(x)As(1-x)P at the specified wavelength, wl (in microns) and Gallium content (x=0.0-1.0).
1265
+ Valid for 0.970 - 2.2 um
1266
+
1267
+ Calc'd by linear interpolation between GaAs() & GaP().
1268
+
1269
+ Args:
1270
+ x: mole ratio of Ga, as in: Ga(x) As(1-x) P [float]
1271
+ wl: wavelength in microns [float]
1272
+ Returns:
1273
+ Refractive index [float]
1274
+ Raises:
1275
+ Warning for wavelength out of model range
1276
+
1277
+ """
1278
+ check_wl(wl, 0.970, 2.20, "GaAsP")
1279
+ return GaAs(wl) - (GaAs(wl) - GaP(wl)) * x
1280
+
1281
+
1282
+ # end def(AlGaAs)
1283
+
1284
+
1285
+ ##########################
1286
+ ### Quaternary Alloys ###
1287
+
1288
+
1289
+ def AlInGaAs(x, wl):
1290
+ """
1291
+ Returns the refractive index of ~Al(x)Ga(1-x)In(1-x-y)As (lattice-matched to InP) at the specified wavelength, wl (in microns) and Aluminum content (x=0.0-1.0).
1292
+
1293
+ For lattice-matching, the actual mole ratio, x, is defined as so:
1294
+ InP-matched X: (Al48 In52 As)_X --> (Ga47 In53 As)_1-X
1295
+
1296
+ Valid for wavelengths: 0.900 - 2.100 um & x: 0.3 - 1.0
1297
+
1298
+ Calc'd by sellmeier equation, with params from:
1299
+ M. J. Mondry, D. I. Babic, J. E. Bowers, and L. A. Coldren, "Refractive indexes of (Al,Ga,In)As epilayers on InP for optoelectronic applications," Phot. Tech. Lett., vol. 4, no. 6, pp. 627-630, 1992
1300
+
1301
+ Parameters
1302
+ ----------
1303
+ x: float
1304
+ Mole ratio of Al, as in: Al(x) Ga(1-x) In(1-x-y) As. Also varies In slightly for lattice-matching.
1305
+
1306
+ wl: float
1307
+ wavelength in microns.
1308
+
1309
+ Returns
1310
+ -------
1311
+ Refractive index [float]
1312
+
1313
+ Raises
1314
+ ------
1315
+ Warning for wavelength out of model range
1316
+
1317
+ """
1318
+ check_wl(wl, 0.900, 2.10, "AlInGaAs")
1319
+
1320
+ xmin = 0.3
1321
+ xmax = 1.0
1322
+ if (x < xmin) or (x > xmax):
1323
+ ErrStr = (
1324
+ "AlInGaAs(): Mole Ratio outside of model range (%f-%f um)." % (xmin, xmax)
1325
+ + " Refractive Index value may not be accurate."
1326
+ )
1327
+ warnings.warn(ErrStr)
1328
+
1329
+ A = 9.689 - 1.012 * x # These params are in nanometers - must convert `wl`
1330
+ B = 1.590 - 0.376 * x
1331
+ C = 1102.4 - 702.0 * x + 330.4 * x**2
1332
+ return sellmeier1((A, B, C), wl * 1e3)
1333
+
1334
+
1335
+ ##############################################
1336
+ ## Dielectrics ##
1337
+ ##############################################
1338
+ # J.A. Woolam: Thermally-oxidized Silicon (Thermal SiO2)
1339
+ JAW_ThermalSiO2 = lambda wl: sellmeier([1.3000, 0.81996, 0.10396, 0.01082], wl)
1340
+ JAW_ThermalSiO2.__doc__ = """SiO2, fused Silica (300-1200nm)
1341
+ C. M. Herzinger, B. Johs, W. A. McGahan, J. A. Woollam, and W. Paulson, "Ellipsometric determination of optical constants for silicon and thermally grown silicon dioxide via a multi-sample, multi-wavelength, multi-angle investigation", JAP, vol. 83, no. 6, pp. 3323-3336, 1998."""
1342
+
1343
+ FusedSiO2 = lambda wl: lorentzian(
1344
+ [1.45659, -8.07311e-6, 1.46187e-1, 2.12786e2, 1.05781e2], wl
1345
+ )
1346
+ FusedSiO2.__doc__ = (
1347
+ "Fused silica, values obtained from luxpop.com. Fit for 300-1200. RMS error: 2E-5"
1348
+ )
1349
+
1350
+
1351
+ ## Ion-Beam Sputtered films (~350-2000nm)
1352
+ IBD_Ta2O5_DJ2007 = lambda wl: cauchy([2.1123, 0.018901, -0.016222], wl)
1353
+ IBD_Ta2O5_DJ2007.__doc__ = "Ion-Beam SPutter Dep'd Ta2O5 from 2007: A=2.1123 B=0.018901 C=-0.016222 n(1550nm) = 2.1123 dep.rate = 326.586 nm/2631.579 sec"
1354
+ IBD_SiO2_DJ2011 = lambda wl: cauchy([1.479, 0.00472, 1.3305e-5], wl)
1355
+ IBD_SiO2_DJ2011.__doc__ = "Ion-Beam Sputter Dep'd SiO2 from 2011"
1356
+
1357
+ IBD_SiN_DJ2010 = lambda wl: cauchy([2.003, 0.01954, 3.0014e-4], wl)
1358
+ IBD_SiN_DJ2010.__doc__ = "Ion-Beam Sputter Dep'd SiN 12/1/2010: A=2.003 // B=0.01954 // C=3.0014e-4 (0.776233 Ang/sec)"
1359
+
1360
+
1361
+ # PECVD Films
1362
+ PECVD_SiN = lambda wl: cauchy([1.818, 0.05071, -9.2297e-4], wl) # recipe:"Nitride2"
1363
+ PECVD_SiO = lambda wl: cauchy([1.469, 0.00508, -5.399e-5], wl) # recipe: "Oxide (HF)"
1364
+
1365
+
1366
+ def NbO(wl):
1367
+ """
1368
+ Calculate refractive index of NbO at specified wavelength
1369
+ Valid from from 0.295 - 2.5 um
1370
+
1371
+ http://refractiveindex.info/?shelf=main&book=Nb2O5&page=Lemarchand
1372
+
1373
+ F. Lemarchand, private communications (2013). Measurement method described in:
1374
+ L. Gao, F. Lemarchand, and M. Lequime. Exploitation of multiple incidences spectrometric measurements for thin film reverse engineering, Opt. Express 20, 15734-15751 (2012)
1375
+
1376
+ Downloaded the data, and then performed a 3-param Cauchy fit.
1377
+
1378
+
1379
+ Args:
1380
+ wl: wavelength in microns (float)
1381
+ Returns:
1382
+ Refractive index (float)
1383
+ Raises:
1384
+ Warning for wavelength out of model range
1385
+
1386
+ """
1387
+ check_wl(wl, 0.295, 2.50, "NbO")
1388
+ return cauchy((2.22686, 0.0214034, 0.00536459), wl)
1389
+
1390
+
1391
+ # end def(NbO)
1392
+
1393
+
1394
+ def a_Si(wl):
1395
+ """
1396
+ Return refractive index for amorphous Silicon, E-Beam deposited (E-6 Torr).
1397
+ Measured by Shamsul Arafin's a-Si in mid-IR.
1398
+
1399
+ Valid from 2.254-4.959um (0.250-0.550eV)
1400
+
1401
+ S. Arafin, "Electrically-Pumped GaSb-Based Vertical-Cavity Surface-Emitting Lasers," 2015.
1402
+ Figure 5.5
1403
+
1404
+ Sellmeier: n^2 = A + (B * •^2 ) / (•^2 - C^2)
1405
+ A = 8.707
1406
+ B = 3.21466
1407
+ C = 0.44105
1408
+
1409
+ Parameters
1410
+ ----------
1411
+ wl: wavelength in microns (float)
1412
+
1413
+ Returns
1414
+ -------
1415
+ Refractive index (float)
1416
+
1417
+ Raises
1418
+ ------
1419
+ Warning for wavelength out of model range
1420
+
1421
+ """
1422
+ check_wl(wl, 2.254, 4.959, "a_Si")
1423
+ return sellmeier1([8.707, 3.21466, 0.44105], wl)
1424
+
1425
+
1426
+ # end a_Si
1427
+
1428
+
1429
+ ####################
1430
+ ## Film aliases ##
1431
+ ####################
1432
+
1433
+ SiO = JAW_ThermalSiO2
1434
+ SiN = PECVD_SiN
1435
+
1436
+
1437
+ ############################
1438
+ ## Internal Funcs ###
1439
+ ############################
1440
+
1441
+
1442
+ def check_wl(wl, wl_low, wl_hi, func_name, fail=False):
1443
+ """Raise a warning if the specified wavelength is out of range.
1444
+
1445
+ Parameters
1446
+ ----------
1447
+ wl: (float or array) the wavelength to check
1448
+ wl_low: (float) minimum wavelength
1449
+ wl_hi: (float) maximum wavelength
1450
+ func_name: (str) name of the function being called - will be inserted into Warning message.
1451
+ fail : {Ture | False}, optional. If True, raise a ValueError exception instead of just a warning.
1452
+ """
1453
+ wlmin = wl_low
1454
+ wlmax = wl_hi
1455
+ if np.any(wl < wlmin) or np.any(wl > wlmax):
1456
+ ErrStr = (
1457
+ str(func_name)
1458
+ + "(): Wavelength (%s um) outside of model range (%f-%f um)."
1459
+ % (wl, wlmin, wlmax)
1460
+ + " Refractive Index value may not be accurate."
1461
+ )
1462
+ if fail:
1463
+ raise ValueError(ErrStr)
1464
+ else:
1465
+ warnings.warn(ErrStr)
1466
+
1467
+
1468
+ # end check_wl()