FreeSnell: Refractive Index Spectra
FreeSnell is a program to compute optical properties of multilayer thin-film coatings.
Spectral data may be given in terms of wavelength, photon energy, frequency, or wavenumber. The real part of each spectral refractive-index value is n; the imaginary part (extinction coefficient) is k.
Where the refractive-index of a dielectric materials is purely real (k=0), sometimes the index-of-refraction is specified as a formula of wavelength. The Refractive index database at http://refractiveindex.info gives a formula for the refractive-index of the plastic PMMA over the range 0.4358.um to 1.052.um. We can encode its formula as a Scheme function:
(require 'FreeSnell) ;; n^2 = C1 + C2*wl^2 + C3*wl^-2 + C4*wl^-4 + C5*wl^-6 + C6*wl^-8 (define PMMA (let ((C1 2.399964) (C2 -8.308636E-2) (C3 -1.919569E-1) (C4 8.720608E-2) (C5 -1.666411E-2) (C6 1.169519E-3)) (lambda (w) ; wavelength in meters ;; wavelength in microns and limited to valid range (let* ((wl (max 0.4358 (min 1.052 (* w 1e6)))) (wl^-2 (/ 1 wl wl))) (sqrt (+ C1 (* C2 wl wl) (* (+ C3 (* (+ C4 (* (+ C5 (* C6 wl^-2)) wl^-2)) wl^-2)) wl^-2))))))) (define (pmma-n) (plot-response (title "PMMA" "pmma") (output-format 'png 495 258) (font 14 "88888+00.8880" "10") (IR PMMA 'real) (wavelengths 0.4358e-6 1.052e-6))) (pmma-n)
The bottom half of this program graphs PMMA's index-of-refraction, which agrees with the plot from the Refractive index database.
|Refractive index database|
FreeSnell is distributed with a relational-ISAM database, "nk.rwb", containing refractive-index spectra for several hundred materials. These spectra come from a variety of sources described below. For some materials (particularly metals), spectra from two sources are combined to yield a wide range spectrum. This is not done in cases were the two sources disagree over n and k values at interleaved wavelengths.
A bundle of spectra for 278 materials is available from:
The Software Spectra company also distributes the Sopra data, although
rewritten into their proprietary format. But their zip file
contains "README.TXT" identifying the Sopra files. This file is used to supply annotations for Sopra spectra. It is renamed to "sopra.txt" in the FreeSnell directory, but not distributed.
$(srcdir)nk.scm --annotate sopra.txt
applies the annotations.
The Sopra spectra have dates spanning 1989 to 1998. Although "README.TXT" dates from 1998-09-30, it has no information about the most recent files:
7824 1998-09-01 10:31 sio2ir.nk 1425 1997-12-05 09:36 bk7_abs.nk 1445 1997-12-03 07:22 sin_bf5.nk 3048 1997-07-19 02:52 gan-tit.nk 2967 1997-07-19 02:50 gan03.nk 2815 1997-07-19 02:40 gan-uv.nk 3289 1997-07-18 19:48 gan02.nk 4124 1997-06-20 22:55 gan01.nk 1866 1997-01-09 10:50 arachi.nk 1329 1996-12-13 06:35 void.nk 2764 1996-11-16 07:47 test.nk 2210 1996-11-07 11:23 sicrir.nk
void and test are removed from "nk.rwb". "sicrir.nk" and "sio2ir.nk" are incorporated into the si and sio2 spectra, respectively.
Sopra's convention of using -a as a suffix for extraordinary-ray (birefringence) is automatically converted to a suffix of -e, the convention used by luxpop.com (below). Ordinary-ray -b is removed from the material name. Some idiosyncratic names have been regularized.
"al2o3p" → "al2o3" "diam" → "d-C" "ir-ZnS" → "ZnS" "ir-ZnSe" → "ZnSe" "mosi2-a" → "mosi2-e" "mosi2-b" → "mosi2" "nbsi-a" → "nbsi-e" "nbsi-b" → "nbsi" "pd2si-a" → "pd2si-e" "pd2si-b" → "pd2si" "sicr" → "si" "sicr-t02" → "si-t02" "sicr-t10" → "si-t10" "sicr-t15" → "si-t15" "sicr-t20" → "si-t20" "sicr-t25" → "si-t25" "sicr-t30" → "si-t30" "sicr-t35" → "si-t35" "sicr-t40" → "si-t40" "sicr-t45" → "si-t45" "sicrir" → "si" "sio2ir" → "sio2" "tasi2-a" → "tasi2-e" "tasi2-b" → "tasi2" "tisi-a" → "tisi-e" "vsi2-a" → "vsi2-e" "vsi2-b" → "vsi2" "wsi2-a" → "wsi2-e" "wsi2-b" → "wsi2" "znscub" → "zns"
Luxpop: Thin film and bulk index of refraction and photonics calculations links to a directory of 274 refractive-index files, mostly X-ray spectra. These files can be fetched by doing:
wget -rl 1 http://luxpop.com/RefractiveIndexList.html
As of 2010-06-10, many of the files are duplicates (eg. Ni.93V.07_llnl_cxro.nk and Ni.93V.07.nk). 28 of the files are concatenations of 56 smaller files. But some of these concatenations have large gaps where the n and k values differ significantly across the gap. In these cases, concatenated data-sets obscure the fact that grossly inaccurate data may be interpolated in the gap.
To use FreeSnell for X-ray calculations, it would be better to create another database containing just X-ray spectra. FreeSnell avoids the aggregated gap problem by eschewing the X-ray and combination files, which leaves the 43 files whose names end with "_palik.nk". Three spectra, "Cr_palik.nk", "SiO_palik.nk", and "W_palik.nk" are missing but can be extracted from the combination files. But "Cr_palik.nk" is not compatible with the chromium spectra from the other sources.
There are some technical problems with the Luxpop files. "Be_palik.nk" is missing its header. luxpop-log.txt has the warnings and errors produced by
./nk.scm --add luxpop.com/Material/*_palik.nk
There are many duplicated wavelength entries reported in luxpop-log.txt. The nk script accepts the first entry for a wavelength and ignores the others. If the ratio between successive wavelengths is more than 3, then nk reports warning: abscissa-gap (but continues processing). If the ratio is larger than 9, then nk reports error: abscissa-gap-too-large, and discards the rest of that file's data. That is the correct treatment for "TiO2_palik.nk" and "TiO2-e_palik.nk", where the gap is at the last line of the file; but the wrong treatment of "AlSb_palik.nk" and "AlAs_palik.nk", where the gaps come in the middle of the files. I remove the short-wavelength sections of "AlSb_palik.nk" and "AlAs_palik.nk" for the purposes of building "nk.rwb".
These 46 "_palik.nk" files describe 43 materials. The files "Se-e_palik.nk", "Te-e_palik.nk", and "TiO2-e_palik.nk" have extraordinary-ray spectra while "Se_palik.nk", "Te_palik.nk", and "TiO2_palik.nk" have ordinary-ray data, those crystals being birefringent. The files "ir-ZnSe_palik.nk" and "ir-ZnS_palik.nk" have data only in the infrared, which dovetail with the Sopra data "znse.nk" and "znscub.nk", respectively. "a-C_palik.nk", arc-evaporated carbon, does not agree with Sopra's carbam, (a-C Amorphous Carbon).
Included with FreeSnell are the following metal spectra (and files) derived from the CRC Handbook of Chemistry and Physics:
ag.nk: eV n k R(th=0) ; Silver al.nk: eV n k R(th=0) ; Aluminium au.nk: eV n k R(th=0) ; Gold, electropolished, Au (110) cr.nk: eV n k R(th=0) ; Chromium cu.nk: eV n k R(th=0) ; Copper fe.nk: eV n k R(th=0) ; Iron ge.nk: eV n k R(th=0) ; Germanium, single crystal li.nk: eV n k R(th=0) ; Lithium ni.nk: eV n k R(th=0) ; Nickel se-e.nk: eV n k R(th=0) ; Selenium, E || to c axis se.nk: eV n k R(th=0) ; Selenium, E _|_ c axis si.nk: eV n k R(th=0) ; Silicon, single crystal ta.nk: eV n k R(th=0) ; Tantalum te-e.nk: eV n k R(th=0) ; Tellurium, E || to c axis te.nk: eV n k R(th=0) ; Tellurium, E _|_ c axis ti.nk: eV n k R(th=0) ; Titanium (Polycrystalline) v.nk: eV n k R(th=0) ; Vanadium w.nk: eV n k R(th=0) ; Tungsten zn-e.nk: eV n k R(th=0) ; Zinc, E || to c^28 zn.nk: eV n k R(th=0) ; Zinc, E _|_ to c^28 zr.nk: eV n k R(th=0) ; Zirconium (Polycrystalline)
Many of these materials are included in the Sopra bundle; but the CRC
data covers a wider wavelength span than the Sopra spectra. Doing
nk --add" of both the CRC and Sopra files produces
wide bandwidth spectra with finer resolution in the visible and
is from GranFilm's version of the Sopra data-set:
for liquid water is from
Segelstein, D., 1981: "The Complex Refractive Index of Water",
M.S. Thesis, University of Missouri--Kansas City
h2o-ice.nk for frozen water is from
S. G. Warren, "Optical constants of ice from the ultraviolet to the microwave,"
Appl. Opt., Vol. 23, No. 8, 15 April, 1984, pp. 1206-1225.
I developed hdpe.nk from published graphs of infrared transmission through polyethylene films. pe.nk is shorter waves in polyethylene.
Another potential source of refractive-index spectra is http://www.rpi.edu/~schubert/Educational resources/Materials - refractive index and extinction coefficient.pdf, although the PDF does not facilitate easy extraction of the data.
nk program is used to create, manage, and query a
refractive-index spectra database. The
nk program reads
all the various formats, figuring out which one from the file header.
So far, files in all the formats have a ".nk" suffix.
Note: With recent releases of FreeSnell (version 1b4 or later), the relational database containing the Sopra and metal spectra is included in the distribution. So installing the nk script is optional.
The "nk.scm" file in the distribution functions as a shell
nk on Unix systems; under MS-Windows, the nk
icon invokes "nk.scm" as an interactive command-line shell
with the prompt "
The optional argument [-F path] (don't type the ) sets the path to the database file to be accessed or created. If it is not given, then the environment variable "NK_DATABASE_PATH" names the database file if defined, defaulting to "nk.rwb" in the current directory. The name for each spectrum in the database is taken from its filename sans the ".nk" or "ir.nk" suffix.
Usage: nk [-F path] Starts the nk shell. Type nk commands without the nk; ^Z to exit. Usage: nk [-F path] --add FILEGLOB.nk ... Add spectra matching FILEGLOB to database. Wildcards must be in the leaf directory only. Usage: nk [-F path] --new FILEGLOB.nk ... Add new or replace spectra matching FILEGLOB to database. Wildcards must be in the leaf directory only. Usage: nk [-F path] --del 'GLOB' ... Delete spectra of names matching GLOB from database. Usage: nk [-F path] --plot 'GLOB' ... Usage: nk [-F path] --lin-lin 'GLOB' ... Usage: nk [-F path] --log-log 'GLOB' ... Usage: nk [-F path] --log-lin 'GLOB' ... Usage: nk [-F path] --lin-log 'GLOB' ... Usage: nk [-F path] --lin-eV 'GLOB' ... Usage: nk [-F path] --log-eV 'GLOB' ... Usage: nk [-F path] --lin-/cm 'GLOB' ... Usage: nk [-F path] --log-/cm 'GLOB' ... Create encapsulated-PostScript (and view with Ghostview) spectra plots from database of names matching GLOB. The first symbol controls the y-axis. Usage: nk [-F path] --list 'GLOB' ... List names of spectra matching GLOB in database. Usage: nk [-F path] --range 'GLOB' ... List names and data ranges of spectra matching GLOB in database. Usage: nk [-F path] --desc 'GLOB' ... List names and descriptions of spectra matching GLOB in database. Usage: nk [-F path] --annotate sopra.txt Add chemical-symbol and description annotations to database. Usage: nk [-F path] NAME NUMBER.UNIT ... Prints NAME's n+k*i values at each NUMBER.UNIT from database. The NUMBER can be fixed or floating point; the UNIT either "eV" (electron-volt) or "m" (meter) with an optional metric prefix or "cm^-1" (wave-number). Usage: nk --help Prints this help and exits.
Although it tries to be careful, if the nk script encounters an unexpected condition while the database file (default nk.rwb) has a table open for writing, then the database file can become unusable from both the nk script and design files. This damage will only result from the nk script; all simulations should be read-only from database files.
To start afresh, delete these files (with all occurrences of nk.rwb replaced by your database name):
If the wedged database was nk.rwb from the distribution, then retrieve nk.rwb from the distribution. Otherwise rebuild your database (using nk --add commands).
FreeSnell comes with a database of refractive-index spectra for several hundred materials. If you want to add spectra of your own, it is probably better to create a separate database for them using:
nk -F <path.rwb> --add <file.nk> ...
This way, mishaps while importing spectra will not wedge FreeSnell's nk.rwb.
Multiple databases can be accessed simultaneously by design files.
As for the distributed nk.rwb, most of the tabular source data is not distributed with FreeSnell. It is stored in subdirectories of the FreeSnell development directory. Some of the files are modified because of technical flaws. In order to get the smoothest combined spectra, files must be added in a certain order, which is accomplished by the Makefile.
The procedure to create this database is:
wget -rl 1 http://luxpop.com/RefractiveIndexList.html
3935.87 0.00000 0.119000 3973.72 0.00000 0.115000 3999.35 0.00000 0.113000 4031.87 0.00000 0.110000 4064.92 0.00000 0.106000 4098.51 0.00000 0.0998000 4132.67 0.00000 0.0638000 4167.40 0.00000 0.0315000 4202.71 0.00000 0.0189000 4238.63 0.00000 0.0118000 4275.17 0.00000 0.0105000 4312.35 0.00000 0.0103000 4350.18 0.00000 0.00993000 4427.86 3.70300 0.00161000 4591.85 3.57000 0.00156000 4768.46 3.47200 0.00153000 4959.20 3.39400 0.00125000
bash$ nk --add *.nk mgo.nk: 0.65.ev :: 10.ev mgo.nk: 401: warning: inserted 400 of 401 values h2o-ice.nk: um n k ; H2O -7.C h2o.nk: um n k ; H2O (liquid) hdpe.nk: um n k ; High Density Polyethylene si.nk: ev n k R(th=0) ; Silicon, single crystal se.nk: ev n k R(th=0) ; Selenium, E _|_ c axis se-e.nk: ev n k R(th=0) ; Selenium, E || to c axis te.nk: ev n k R(th=0) ; Tellurium, E _|_ c axis te-e.nk: ev n k R(th=0) ; Tellurium, E || to c axis ag.nk: ev n k R(th=0) ; Silver al.nk: ev n k R(th=0) ; Aluminium au.nk: ev n k R(th=0) ; Gold, electropolished, Au (110) cr.nk: ev n k R(th=0) ; Chromium cu.nk: ev n k R(th=0) ; Copper cu.nk: 4: warning: abscissa-gap 0.1 < 0.5 0.10 29.69 71.57 0.980 0.50 1.71 17.63 0.979 fe.nk: ev n k R(th=0) ; Iron ge.nk: ev n k R(th=0) ; Germanium, single crystal ge.nk: 19: warning: abscissa-gap 0.1 < 0.6 0.1 4.0063 3.70E-05 0.361 0.6 4.104 6.58E-07 0.370 li.nk: ev n k R(th=0) ; Lithium li.nk: 4: warning: abscissa-gap 0.14 < 0.54 0.14 0.659 38.0 0.998 0.54 0.661 12.6 0.984 ni.nk: ev n k R(th=0) ; Nickel ta.nk: ev n k R(th=0) ; Tantalum ti.nk: ev n k R(th=0) ; Titanium (Polycrystalline) v.nk: ev n k R(th=0) ; Vanadium w.nk: ev n k R(th=0) ; Tungsten zn-e.nk: ev n k R(th=0) ; Zinc, E || to c axis zn.nk: ev n k R(th=0) ; Zinc, E _|_ to c axis zr.nk: ev n k R(th=0) ; Zirconium (Polycrystalline)
bash$ nk --list 7059 a-c a-sih ag againp0 againp1 againp10 againp3 againp6 againp7 al al2o3 alas alas028t alas052t alas072t alas098t alas125t alas152t alas178t alas204t alas228t alas305t alas331t alas361t alas390t alas421t alas445t alas469t alas499t alas527t alas552t alas578t alas602t alas626t alcu algaas0 algaas1 algaas10 algaas2 algaas3 algaas4 algaas5 algaas6 algaas7 algaas8 algaas9 alon alsb alsi alsiti arachi asi au baf2 be beo bk7 bk7_abs caf2 carbam ccl4 cdse cdte co co_2 cor7059 cosi2-4 cr cr3si cr5si3 crsi2el2 csi cu cu2o cuo d-c fe fesi2el1 fesi2el2 fesi2epi gaas gaas031t gaas041t gaas060t gaas081t gaas100 gaas103t gaas111 gaas126t gaas150t gaas175t gaas199t gaas224t gaas249t gaas273t gaas297t gaas320t gaas344t gaas367t gaas391t gaas415t gaas443t gaas465t gaas488t gaas515t gaas546t gaas579t gaas603t gaas634t gaaso gaasox gan-tit gan01 gan02 gan03 gan60 gan70 gap gap100 gapox gasb gasbox ge ge100 h2o h2o-ice hdpe hfo2 hfsi2 hg hgcdte0 hgcdte2 hgcdte3 hgte inas inasox ingaas ingasb0 ingasb1 ingasb10 ingasb3 ingasb5 ingasb7 ingasb9 inp inpox insb insbox ir ir3si5e ir3si5p ito2 k kbr kcl lasf9 li lif mgf2 mgo mo mosi2 mosi2-e na nacl nb nbsi nbsi-e ni ni2si ni3si nisi os p_sias p_siud pbs pbse pd pd2si pd2si-e pt resi1-75 resige0 resige1 resige22 resige39 resige51 resige64 resige75 resige83 resige91 rh ringas0 ringas10 ringas20 ringas24 se se-e sf11 si si-t02 si-t10 si-t15 si-t20 si-t25 si-t30 si-t35 si-t40 si-t45 si100_2 si110 si111 si11ge89 si20ge80 si28ge72 si3n4 si65ge35 si85ge15 si98ge02 siam1 siam2 sic sige_ge sige_si sin_bf5 singas0 singas10 singas20 singas24 sio sio2 sion0 sion20 sion40 sion60 sion80 siop sipoly sipoly10 sipoly20 sipoly30 sipoly40 sipoly50 sipoly60 sipoly70 sipoly80 sipoly90 sipore snte stsg0 stsg064 stsg123 stsg169 stsg229 ta taox1 taox2 tasi2 tasi2-e te te-e thf4 ti tic tin tini tio2 tio2-e tisi-e v vc vn vsi2 vsi2-e w wsi2 wsi2-e y2o3 zn zn-e zncdte0 zncdte1 zncdte10 zncdte3 zncdte5 zncdte7 zncdte9 zns znse znsete0 znsete1 znsete10 znsete3 znsete5 znsete7 znsete9 zr zro2 zrsi2
bash$ nk --plot co
bash$ nk co .3.um .5.um 1.3.eV co: 1.218+2.11i @ 300.nm (4.13.eV) (33333.3.cm^-1) co: 2.025+3.72i @ 500.nm (2.48.eV) (20000.cm^-1) >>>> co: 1.3.eV not in range 1.38 to 4.96.
bash$ nk Al 400.cm^-1 al: 75.77+1.7e+02i @ (25.0.um) (0.0496.eV) 400.cm^-1
bash$ nk --desc "sio*" sio SiO Silicon Monoxide sio2 SiO2 Silicon Dioxide sion0 SiO Silicon Oxynitride (10% N) * sion20 SiO0.8N0.2 Silicon Oxynitride (20% N) sion40 SiO0.6N0.4 Silicon Oxynitride (40% N) sion60 SiO0.4N0.6 Silicon Oxynitride (60% N) sion80 SiO0.2N0.8 Silicon Oxynitride (80% N) siop SiO Silicon Monoxide
bash$ nk --range "sio*" sio 49.6.nm to 14.0.um; 88.6.meV to 25.0.eV; 714/cm to 201645/cm sio2 163.nm to 25.0.um; 49.6.meV to 7.60.eV; 400/cm to 61298/cm sion0 250.nm to 800.nm; 1.55.eV to 4.96.eV; 12500/cm to 40000/cm sion20 250.nm to 800.nm; 1.55.eV to 4.96.eV; 12500/cm to 40000/cm sion40 250.nm to 800.nm; 1.55.eV to 4.96.eV; 12500/cm to 40000/cm sion60 250.nm to 800.nm; 1.55.eV to 4.96.eV; 12500/cm to 40000/cm sion80 250.nm to 800.nm; 1.55.eV to 4.96.eV; 12500/cm to 40000/cm siop 191.nm to 1.91.um; 0.650.eV to 6.50.eV; 5243/cm to 52426/cm
The next section tests FreeSnell's modeling of dielectric films.
I am a guest and not a member of the MIT Computer Science and Artificial Intelligence Laboratory.
My actions and comments do not reflect in any way on MIT.|
|agj @ alum.mit.edu||Go Figure!|