refractive index curve for cobalt

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.

Parametric Data

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 gives a formula for the refractive-index of the plastic PMMA over the range to 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

(define (pmma-n)
   (title "PMMA" "pmma")
   (output-format 'png 495 258)
   (font 14 "88888+00.8880" "10")
   (IR PMMA 'real)
   (wavelengths 0.4358e-6 1.052e-6)))

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

Tabular Data

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 (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

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*_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).

CRC Handbook of Chemistry and Physics

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 near-infrared bands.


mgo.nk is from GranFilm's version of the Sopra data-set:

h2o.nk 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 resources/Materials - refractive index and extinction coefficient.pdf, although the PDF does not facilitate easy extraction of the data.

The nk Script

The 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 script named nk on Unix systems; under MS-Windows, the nk icon invokes "nk.scm" as an interactive command-line shell with the prompt "nk".

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
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.

Wedged Databases

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).

Building Refractive-Index Databases

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:


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 1.3.eV
co: 1.218+2.11i @ 300.nm (4.13.eV) (^-1)
co: 2.025+3.72i @ 500.nm (2.48.eV) (^-1)
>>>> co: 1.3.eV not in range 1.38 to 4.96.
bash$ nk Al^-1
al: 75.77+1.7e+02i @ ( (0.0496.eV)^-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;  88.6.meV to 25.0.eV;    714/cm to 201645/cm
sio2        163.nm to;  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;  0.650.eV to 6.50.eV;   5243/cm to 52426/cm

The next section tests FreeSnell's modeling of dielectric films.

Copyright © 2003, 2004, 2005, 2006, 2007, 2009, 2010, 2012 Aubrey Jaffer

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 @
Go Figure!