Commit f00c4cf0 authored by Sean Leavey's avatar Sean Leavey

New test for multimaterial stack from Steinlechner et al.

parent 6928cfe1
# Ditherm: Dielectric Thermal Noise Calculator # Ditherm: Dielectric Thermal Noise Calculator
This is a tool to calculate Brownian thermal noise in dielectric mirror stacks. In theory, it supports noise calculations for n-layer stacks of any material, but it has only been tested with two-material stacks using data from the [Advanced LIGO](https://www.advancedligo.mit.edu/) noise calculator, [GWINC](https://awiki.ligo-wa.caltech.edu/aLIGO/GWINC) (that link requires albert.einstein style credentials, available to members of the LIGO Scientific Community only). This is a tool to calculate Brownian thermal noise in dielectric mirror stacks.
## Notes ## It supports noise calculations for n-layer stacks of any material, but it has only been tested in the following scenarios:
- Two-material stacks using data from the [Advanced LIGO](https://www.advancedligo.mit.edu/) noise calculator, [GWINC](https://awiki.ligo-wa.caltech.edu/aLIGO/GWINC) (link requires albert.einstein style credentials, available to members of the LIGO Scientific Community only)
- A three-material stack using a single data point from [Steinlechner et al.](http://journals.aps.org/prd/abstract/10.1103/PhysRevD.91.042001)
The code can calculate arbitrary material stacks due to an extension to a two-material Brownian thermal noise calculation provided in scientific literature. The extension is unpublished and probably wrong, but this is hopefully the beginning of something that will one day produce trusted results. Due to the lack of systematic testing, take what this script says with a heavy pinch of salt - you have been warned!
## More Notes ##
I provide this software without any kind of guarantee that it provides the correct answer. This software is in no way affiliated with or endorsed by any university or organisation - it is purely the work of a private individual. I provide this software without any kind of guarantee that it provides the correct answer. This software is in no way affiliated with or endorsed by any university or organisation - it is purely the work of a private individual.
In particular, the extension from the two-material Brownian noise calculation (mostly based on Harry et al., 2002) to an n-material calculation was performed simply by inspecting the formulae. I don't know if this is reasonable or not. I suspect that for coatings with more than a few (~3) materials and with extremely small or large (outwith the range wavelength * 0.15 to wavelength * 0.35) optical thicknesses per layer, the results will diverge from reality. Use at your own risk! In particular, the extension from the two-material Brownian noise calculation (mostly based on Harry et al., 2002) to an n-material calculation was performed simply by inspecting the formulae. I don't know if this is reasonable or not. I suspect that for coatings with more than a few (~3) materials and with extremely small or large (outwith the range wavelength * 0.15 to wavelength * 0.35) optical thicknesses per layer, the results will diverge from reality. Use at your own risk!
...@@ -14,7 +20,6 @@ To test the software against precomputed values from GWINC, run: ...@@ -14,7 +20,6 @@ To test the software against precomputed values from GWINC, run:
from the root Ditherm directory (the same directory as this readme). from the root Ditherm directory (the same directory as this readme).
## Future Work ## ## Future Work ##
- Test against a three-material coating such as the one used in [Steinlechner et al.](http://journals.aps.org/prd/abstract/10.1103/PhysRevD.91.042001)
- Implement phase correction to Brownian calculation as per the functions on [this page](https://awiki.ligo-wa.caltech.edu/aLIGO/GWINC) - Implement phase correction to Brownian calculation as per the functions on [this page](https://awiki.ligo-wa.caltech.edu/aLIGO/GWINC)
- Look at proper way to combine multiple materials by reading these papers: - Look at proper way to combine multiple materials by reading these papers:
- http://journals.aps.org/prd/abstract/10.1103/PhysRevD.91.042002 - http://journals.aps.org/prd/abstract/10.1103/PhysRevD.91.042002
......
...@@ -44,7 +44,24 @@ class AdvancedLigoItmStack(stacks.Stack): ...@@ -44,7 +44,24 @@ class AdvancedLigoItmStack(stacks.Stack):
super(AdvancedLigoItmStack, self).__init__(theseLayers, substrate) super(AdvancedLigoItmStack, self).__init__(theseLayers, substrate)
class TestBrownianNoise(TestCase): class SteinlechnerMultimaterialStack(stacks.Stack):
def __init__(self):
substrate = materials.Material("Silica Substrate", 7.2e10, 0.167, 5e-9, 1.45)
coatingA = materials.Material("Silica Coating", 7.2e10, 0.17, 4e-5, 1.45)
coatingB = materials.Material("Tantala Coating", 1.47e11, 0.23, 2.3e-4, 2.2)
coatingC = materials.Material("Silicon Coating", 1.4e11, 0.22, 4.0e-4, 3.5)
layerA = layers.Layer(coatingA, 267e-9)
layerB = layers.Layer(coatingB, 176e-9)
layerC = layers.Layer(coatingB, 111e-9)
topLayer = layers.Layer(coatingA, 2*267e-9)
theseLayers = np.array([topLayer, layerB] + [layerA, layerB] * 7 + [layerA, layerC] * 5)
super(SteinlechnerMultimaterialStack, self).__init__(theseLayers, substrate)
class TestAdvancedLigoBrownianNoise(TestCase):
def setUp(self): def setUp(self):
self.etmStack = AdvancedLigoEtmStack(1064e-9) self.etmStack = AdvancedLigoEtmStack(1064e-9)
self.itmStack = AdvancedLigoItmStack(1064e-9) self.itmStack = AdvancedLigoItmStack(1064e-9)
...@@ -98,4 +115,28 @@ class TestBrownianNoise(TestCase): ...@@ -98,4 +115,28 @@ class TestBrownianNoise(TestCase):
# calculate noise # calculate noise
dithermETM = self.etmStack.brownianNoise(gwincData[:, 0], wETM, T) dithermETM = self.etmStack.brownianNoise(gwincData[:, 0], wETM, T)
self.assertTrue(np.allclose(dithermETM, gwincData[:, 2], rtol=0.05, atol=0)) self.assertTrue(np.allclose(dithermETM, gwincData[:, 2], rtol=0.05, atol=0))
\ No newline at end of file
class TestSteinlechnerMultimaterialBrownianNoise(TestCase):
def setUp(self):
self.stack = SteinlechnerMultimaterialStack()
def test_d(self):
# value from p3 of http://journals.aps.org/prd/abstract/10.1103/PhysRevD.91.042001
# for multimaterial SiO2/TaO5/aSi stack
steinlechnerValue = 5.701e-6
self.assertAlmostEqual(self.stack.d(), steinlechnerValue, delta=1e-15*steinlechnerValue)
def test_brownian_noise(self):
w = 72.5e-3
T = 290
# calculate noise at 100 Hz
ditherm = self.stack.brownianNoise(np.array([100]), w, T)
# value from p3 of http://journals.aps.org/prd/abstract/10.1103/PhysRevD.91.042001
# for multimaterial SiO2/TaO5/aSi stack
steinlechnerValue = 4.3e-21
self.assertAlmostEqual(np.sqrt(ditherm[0]), steinlechnerValue, delta=0.15*steinlechnerValue)
\ No newline at end of file
"""
Brownian noise in multimaterial stack described in Phys. Rev. D 91, 042001
(http://journals.aps.org/prd/abstract/10.1103/PhysRevD.91.042001)
Beam size assumed to be that of ET-HF (see p242 of https://tds.ego-gw.it/itf/tds/index.php?callContent=2&callCode=8709)
"""
from __future__ import division
import sys
sys.path.append('..')
import stacks
import matplotlib.pyplot as plt
import numpy as np
###
# Parameters
# frequency range
f = np.logspace(0, 3, 1000) # [Hz]
# temperature
T = 290 # [K]
# beam sizes (distance from centre where power drops to 1/e)
w = 72.5e-3 # [m]
###
# Calculation
stack = stacks.SteinlechnerMultimaterialStack()
# calculate Brownian noise amplitude for frequency range
brownianNoise = stack.brownianNoise(f, w, T)
###
# Plot
# log-log plot
plt.loglog(f, np.sqrt(brownianNoise))
# axis labels, etc.
plt.xlabel('Frequency [Hz]')
plt.ylabel('Displacement-equivalent noise [m / sqrt(Hz)]')
plt.title('Brownian noise in multilayer coating from Phys. Rev. D 91, 042001')
# add grid
plt.grid(True)
# display
plt.show()
\ No newline at end of file
from __future__ import division
import sys
sys.path.append('../..')
import ditherm.materials as materials
import ditherm.layers as layers
import ditherm.stacks as stacks
import numpy as np
class SteinlechnerMultimaterialStack(stacks.Stack):
"""
Dielectric stack as described in http://journals.aps.org/prd/abstract/10.1103/PhysRevD.91.042001.
Poisson's ratio for amorphous silicon taken from http://www.mit.edu/~6.777/matprops/asi.htm
"""
def __init__(self):
substrate = materials.Material("Silica Substrate", 7.2e10, 0.167, 5e-9, 1.45)
coatingA = materials.Material("Silica Coating", 7.2e10, 0.17, 4e-5, 1.45)
coatingB = materials.Material("Tantala Coating", 1.47e11, 0.23, 2.3e-4, 2.2)
coatingC = materials.Material("Silicon Coating", 1.4e11, 0.22, 4.0e-4, 3.5)
layerA = layers.Layer(coatingA, 267e-9)
layerB = layers.Layer(coatingB, 176e-9)
layerC = layers.Layer(coatingB, 111e-9)
topLayer = layers.Layer(coatingA, 2*267e-9)
theseLayers = np.array([topLayer, layerB] + [layerA, layerB] * 7 + [layerA, layerC] * 5)
super(SteinlechnerMultimaterialStack, self).__init__(theseLayers, substrate)
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment