Source code for arc.materials
import numpy as np
import os
from .alkali_atom_functions import DPATH
[docs]class OpticalMaterial(object):
"""
Abstract class implementing calculation of basic properties for optical
materials.
"""
#: Human-friendly name of material
name = ""
#: List of .csv files listing refractive index measurements
#: first column in these files is wavelength (in mu m), the second
#: refractive index
sources = []
# This array is loaded automatically based on sources list
sourcesN = []
#: Any notes about measured values
sourcesComment = []
#: Array of max and minimal wavelegth pairs [lambdaMin, lambdaMax]
#: for each of the sources. Automatically loaded from sources list
sourcesRange = []
def __init__(self):
for s in self.sources:
self.sourcesN.append(
np.loadtxt(os.path.join(DPATH, "refractive_index_data", s),
skiprows=1, delimiter=',', unpack=True)
)
self.sourcesRange.append([self.sourcesN[-1][0].min(),
self.sourcesN[-1][0].max()])
[docs] def getN(self, *args, **kwargs):
"""
Refractive index of material
"""
return "To-do: refractive index"
def getRho(self):
return "To-do: density"
def getElectricConductance(self):
return "To-do: electric condctance"
def getThermalConductance(self):
return "To-do: thermal conductance"
[docs]class Air(OpticalMaterial):
"""
Air as an optical material at normal conditions
"""
name = "Air (dry, normal conditions)"
sources = ["Mathar-1.3.csv",
"Mathar-2.8.csv",
"Mathar-4.35.csv",
"Mathar-7.5.csv"]
sourcesComment = ['vacuum', 'vacuum', 'vacuum', 'vacuum']
[docs] def getN(self, vacuumWavelength=None, *args, **kwargs):
"""
Assumes temperature: 15 °C, pressure: 101325 Pa
"""
if vacuumWavelength is not None:
x = vacuumWavelength
else:
raise ValueError("wavelength not specified for refractive index")
if (x > 0.23) and (x < 1.690):
return 1 + 0.05792105 / (238.0185 - x**(-2)) \
+ 0.00167917 / (57.362 - x**(-2))
else:
for i, rangeN in enumerate(self.sourcesRange):
if (x > rangeN[0]) and (x < rangeN[1]):
return np.interp(x, self.sourcesN[i][0],
self.sourcesN[i][1])
raise ValueError("No refrative index data available for requested"
" wavelength %.3f mum" % x)
[docs]class Sapphire(OpticalMaterial):
"""
Sapphire as optical material.
"""
name = "Sapphire"
# data from: https://refractiveindex.info
sources = ["Querry-o.csv", "Querry-e.csv"]
sourcesN = []
sourcesComment = ["o", "e"]
[docs] def getN(self, vacuumWavelength=None,
airWavelength=None,
axis='ordinary', *args, **kwargs):
"""
"""
if vacuumWavelength is not None:
air = Air()
x = vacuumWavelength / air.getN(vacuumWavelength=vacuumWavelength)
elif airWavelength is not None:
x = airWavelength
else:
raise ValueError("wavelength not specified for refractive index")
if (axis == 'ordinary') or (axis == 'o'):
# electric field polarisation perpendicular to cristal axis
if (x > 0.2) and (x < 5.0):
return (1 + 1.4313493 / (1 - (0.0726631 / x)**2)
+ 0.65054713 / (1 - (0.1193242 / x)**2)
+ 5.3414021 / (1 - (18.028251 / x)**2))**.5
else:
for i, rangeN in enumerate(self.sourcesRange):
if (x > rangeN[0]) and (x < rangeN[1]) \
and (self.sourcesComment[i] == "o"):
return np.interp(x, self.sourcesN[i][0],
self.sourcesN[i][1])
raise ValueError("No refrative index data available for "
"requested wavelength %.3f mum" % x)
elif (axis == 'extraordinary') or (axis == 'e'):
# electric field polarisation along cristal axis
if (x > 0.2) or (x < 5.0):
return (1 + 1.5039759 / (1 - (0.0740288 / x)**2)
+ 0.55069141 / (1 - (0.1216529 / x)**2)
+ 6.5927379 / (1 - (20.072248 / x)**2))**.5
else:
for i, rangeN in enumerate(self.sourcesRange):
if (x > rangeN[0]) and (x < rangeN[1]) \
and (self.sourcesComment[i] == "e"):
return np.interp(x, self.sourcesN[i][0],
self.sourcesN[i][1])
raise ValueError("No refrative index data available for "
"requested wavelength %.3f mum" % x)
else:
raise ValueError("Uknown axis")