better gases
This commit is contained in:
@@ -43,6 +43,7 @@ reference = ["CDGM Zemax catalog 2017-09 (obtained from http://www.cdgmgd.com)"]
|
|||||||
[air]
|
[air]
|
||||||
a = 0.1358
|
a = 0.1358
|
||||||
b = 3.64e-5
|
b = 3.64e-5
|
||||||
|
atomic_mass = 4.809e-26
|
||||||
|
|
||||||
[air.sellmeier]
|
[air.sellmeier]
|
||||||
B = [57921050000.0, 1679170000.0]
|
B = [57921050000.0, 1679170000.0]
|
||||||
@@ -60,6 +61,7 @@ source = "Pigeon, J. J., Tochitsky, S. Y., Welch, E. C., & Joshi, C. (2016). Mea
|
|||||||
[nitrogen]
|
[nitrogen]
|
||||||
a = 0.137
|
a = 0.137
|
||||||
b = 1.709e-5
|
b = 1.709e-5
|
||||||
|
atomic_mass = 2.3259e-26
|
||||||
|
|
||||||
[nitrogen.sellmeier]
|
[nitrogen.sellmeier]
|
||||||
B = [32431570000.0]
|
B = [32431570000.0]
|
||||||
@@ -80,6 +82,7 @@ a = 0.00346
|
|||||||
b = 2.38e-5
|
b = 2.38e-5
|
||||||
ionization_energy = 3.9393356074281e-18
|
ionization_energy = 3.9393356074281e-18
|
||||||
atomic_number = 2
|
atomic_number = 2
|
||||||
|
atomic_mass = 6.646477e-27
|
||||||
|
|
||||||
[helium.sellmeier]
|
[helium.sellmeier]
|
||||||
B = [2.16463842e-5, 2.10561127e-7, 4.7509272e-5]
|
B = [2.16463842e-5, 2.10561127e-7, 4.7509272e-5]
|
||||||
@@ -115,6 +118,7 @@ n2 = 3.1e-25
|
|||||||
[hydrogen]
|
[hydrogen]
|
||||||
a = 0.02453
|
a = 0.02453
|
||||||
b = 2.651e-5
|
b = 2.651e-5
|
||||||
|
atomic_mass = 1.674e-27
|
||||||
|
|
||||||
[hydrogen.sellmeier]
|
[hydrogen.sellmeier]
|
||||||
B = [0.0148956, 0.0049037]
|
B = [0.0148956, 0.0049037]
|
||||||
@@ -135,6 +139,7 @@ a = 0.02135
|
|||||||
b = 1.709e-5
|
b = 1.709e-5
|
||||||
ionization_energy = 3.45501365359425e-18
|
ionization_energy = 3.45501365359425e-18
|
||||||
atomic_number = 10
|
atomic_number = 10
|
||||||
|
atomic_mass = 3.35092e-26
|
||||||
|
|
||||||
[neon.sellmeier]
|
[neon.sellmeier]
|
||||||
B = [1281450000.0, 22048600000.0]
|
B = [1281450000.0, 22048600000.0]
|
||||||
@@ -154,6 +159,7 @@ a = 0.1355
|
|||||||
b = 3.201e-5
|
b = 3.201e-5
|
||||||
ionization_energy = 2.5249661793774e-18
|
ionization_energy = 2.5249661793774e-18
|
||||||
atomic_number = 18
|
atomic_number = 18
|
||||||
|
atomic_mass = 6.6338e-26
|
||||||
|
|
||||||
[argon.sellmeier]
|
[argon.sellmeier]
|
||||||
B = [2501410000.0, 500283000.0, 52234300000.0]
|
B = [2501410000.0, 500283000.0, 52234300000.0]
|
||||||
@@ -211,6 +217,7 @@ a = 0.2349
|
|||||||
b = 3.978e-5
|
b = 3.978e-5
|
||||||
ionization_energy = 2.2429831039374e-18
|
ionization_energy = 2.2429831039374e-18
|
||||||
atomic_number = 36
|
atomic_number = 36
|
||||||
|
atomic_mass = 1.3915e-25
|
||||||
|
|
||||||
[krypton.sellmeier]
|
[krypton.sellmeier]
|
||||||
B = [2536370000.0, 2736490000.0, 62080200000.0]
|
B = [2536370000.0, 2736490000.0, 62080200000.0]
|
||||||
@@ -230,6 +237,7 @@ a = 0.425
|
|||||||
b = 5.105e-5
|
b = 5.105e-5
|
||||||
ionization_energy = 1.94342415157935
|
ionization_energy = 1.94342415157935
|
||||||
atomic_number = 54
|
atomic_number = 54
|
||||||
|
atomic_mass = 2.18017e-25
|
||||||
|
|
||||||
[xenon.sellmeier]
|
[xenon.sellmeier]
|
||||||
B = [3228690000.0, 3553930000.0, 60676400000.0]
|
B = [3228690000.0, 3553930000.0, 60676400000.0]
|
||||||
@@ -247,6 +255,7 @@ source = "Wahlstrand, J. K., Cheng, Y. H., & Milchberg, H. M. (2012). High field
|
|||||||
[vacuum]
|
[vacuum]
|
||||||
a = 0
|
a = 0
|
||||||
b = 0
|
b = 0
|
||||||
|
atomic_mass = 0
|
||||||
|
|
||||||
[vacuum.sellmeier]
|
[vacuum.sellmeier]
|
||||||
B = []
|
B = []
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import functools
|
|||||||
from typing import Any
|
from typing import Any
|
||||||
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
|
from dataclasses import dataclass, field
|
||||||
|
|
||||||
from .. import utils
|
from .. import utils
|
||||||
from ..cache import np_cache
|
from ..cache import np_cache
|
||||||
@@ -10,6 +11,76 @@ from . import units
|
|||||||
from .units import NA, c, kB, epsilon0
|
from .units import NA, c, kB, epsilon0
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class Sellmeier:
|
||||||
|
B: list[float] = field(default_factory=list)
|
||||||
|
C: list[float] = field(default_factory=list)
|
||||||
|
pressure_ref: float = 101325
|
||||||
|
temperature_ref: float = 273.15
|
||||||
|
kind: int = 2
|
||||||
|
constant: float = 0
|
||||||
|
|
||||||
|
def chi(self, wl: np.ndarray, temperature=None, pressure=None) -> np.ndarray:
|
||||||
|
"""n^2 - 1"""
|
||||||
|
chi = np.zeros_like(wl) # = n^2 - 1
|
||||||
|
if self.kind == 1:
|
||||||
|
for b, c_ in zip(self.B, self.C):
|
||||||
|
chi += wl ** 2 * b / (wl ** 2 - c_)
|
||||||
|
elif self.kind == 2: # gives n-1
|
||||||
|
for b, c_ in zip(self.B, self.C):
|
||||||
|
chi += b / (c_ - 1 / wl ** 2)
|
||||||
|
chi += self.constant
|
||||||
|
chi = (chi + 1) ** 2 - 1
|
||||||
|
elif self.kind == 3: # Schott formula
|
||||||
|
for i, b in reversed(list(enumerate(self.B))):
|
||||||
|
chi += b * wl ** (-2 * (i - 1))
|
||||||
|
chi = chi - 1
|
||||||
|
else:
|
||||||
|
raise ValueError(f"kind {self.kind} is not recognized.")
|
||||||
|
|
||||||
|
if temperature is not None:
|
||||||
|
chi *= self.temperature_ref / temperature
|
||||||
|
|
||||||
|
if pressure is not None:
|
||||||
|
chi *= pressure / self.pressure_ref
|
||||||
|
return chi
|
||||||
|
|
||||||
|
|
||||||
|
class GasInfo:
|
||||||
|
sellmeier: Sellmeier
|
||||||
|
n2: float
|
||||||
|
atomic_number: int
|
||||||
|
atomic_mass: float
|
||||||
|
|
||||||
|
def __init__(self, gas_name: str):
|
||||||
|
self.mat_dico = utils.load_material_dico(gas_name)
|
||||||
|
self.n2 = self.mat_dico["kerr"]["n2"]
|
||||||
|
self.atomic_mass = self.mat_dico["atomic_mass"]
|
||||||
|
self.atomic_number = self.mat_dico["atomic_number"]
|
||||||
|
|
||||||
|
s = self.mat_dico.get("sellmeier", {})
|
||||||
|
self.sellmeier = Sellmeier(
|
||||||
|
**{
|
||||||
|
newk: s.get(k, None)
|
||||||
|
for newk, k in zip(
|
||||||
|
["B", "C", "pressure_ref", "temperature_ref", "kind", "constant"],
|
||||||
|
["B", "C", "P0", "T0", "kind", "const"],
|
||||||
|
)
|
||||||
|
if k in s
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
def pressure_from_density(self, density: float, temperature: float = None) -> float:
|
||||||
|
temperature = temperature or self.sellmeier.temperature_ref
|
||||||
|
return kB * temperature * density / self.atomic_mass
|
||||||
|
|
||||||
|
def get(self, key, default=None):
|
||||||
|
return self.mat_dico.get(key, default)
|
||||||
|
|
||||||
|
def __getitem__(self, key):
|
||||||
|
return self.mat_dico[key]
|
||||||
|
|
||||||
|
|
||||||
@np_cache
|
@np_cache
|
||||||
def n_gas_2(
|
def n_gas_2(
|
||||||
wl_for_disp: np.ndarray, gas_name: str, pressure: float, temperature: float, ideal_gas: bool
|
wl_for_disp: np.ndarray, gas_name: str, pressure: float, temperature: float, ideal_gas: bool
|
||||||
@@ -82,7 +153,7 @@ def number_density_van_der_waals(
|
|||||||
b = material_dico.get("b", 0) if b is None else b
|
b = material_dico.get("b", 0) if b is None else b
|
||||||
pressure = material_dico["sellmeier"].get("P0", 101325) if pressure is None else pressure
|
pressure = material_dico["sellmeier"].get("P0", 101325) if pressure is None else pressure
|
||||||
temperature = (
|
temperature = (
|
||||||
material_dico["sellmeier"].get("t0", 273.15) if temperature is None else temperature
|
material_dico["sellmeier"].get("T0", 273.15) if temperature is None else temperature
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
a = 0 if a is None else a
|
a = 0 if a is None else a
|
||||||
|
|||||||
Reference in New Issue
Block a user