Skip to content
Snippets Groups Projects

Residual gas sub-budgets and updates

Merged Kevin Kuns requested to merge kevin.kuns/pygwinc:residual-gas into master
6 unresolved threads
1 file
+ 1
1
Compare changes
  • Side-by-side
  • Inline
+ 93
22
@@ -5,18 +5,21 @@ from __future__ import division
@@ -5,18 +5,21 @@ from __future__ import division
from numpy import sqrt, log, pi
from numpy import sqrt, log, pi
from .. import const
from .. import const
 
from .. import Struct
def residual_gas_cavity(f, ifo):
def residual_gas_scattering_arm(f, ifo, cavity, species):
"""Residual gas noise strain spectrum in an evacuated cavity.
"""Residual gas noise strain spectrum due to scattering from one arm
Noise caused by the passage of residual gas molecules through the
Noise caused by the passage of residual gas molecules through the
laser beams in a cavity.
laser beams in one arm cavity due to scattering.
:f: frequency array in Hz
:f: frequency array in Hz
:ifo: gwinc IFO structure
:ifo: gwinc IFO structure
 
:cavity: arm cavity structure
 
:species: molecular species structure
:returns: arm displacement noise power spectrum at :f:
:returns: arm strain noise power spectrum at :f:
The method used here is presented by Rainer Weiss, Micheal
The method used here is presented by Rainer Weiss, Micheal
E. Zucker, and Stanley E. Whitcomb in their paper Optical
E. Zucker, and Stanley E. Whitcomb in their paper Optical
@@ -28,26 +31,19 @@ def residual_gas_cavity(f, ifo):
@@ -28,26 +31,19 @@ def residual_gas_cavity(f, ifo):
expansion of exp, to speed it up.
expansion of exp, to speed it up.
"""
"""
Lambda = ifo.Laser.Wavelength
L = ifo.Infrastructure.Length
L = ifo.Infrastructure.Length
kT = ifo.Infrastructure.Temp * const.kB
kT = ifo.Infrastructure.Temp * const.kB
P = ifo.Infrastructure.ResidualGas.pressure
P = species.BeamtubePressure
M = ifo.Infrastructure.ResidualGas.mass
M = species.mass
alpha = ifo.Infrastructure.ResidualGas.polarizability
alpha = species.polarizability
R1 = ifo.Optics.Curvature.ITM
R2 = ifo.Optics.Curvature.ETM
rho = P / (kT) # number density of Gas
v0 = sqrt(2*kT / M) # mean speed of Gas
rho = P /(kT) # number density of Gas
v0 = sqrt(2*kT / M) # mean speed of Gas
waist = cavity.w0 # Gaussian beam waist size
zr = cavity.zr # Rayleigh range
g1 = 1 - L/R1 # first resonator g-parameter of the ITM
z1 = -cavity.zBeam_ITM # location of ITM relative to the waist
g2 = 1 - L/R2 # second resonator g-parameter of the ETM
z2 = cavity.zBeam_ETM # location of ETM relative to the waist
waist = L * Lambda / pi
waist = waist * sqrt(((g1*g2)*(1-g1*g2))/((g1+g2-2*g1*g2)**2))
waist = sqrt(waist) # Gaussian beam waist size
zr = pi*waist**2 / Lambda # Rayleigh range
z1 = -((g2*(1-g1))/(g1+g2-2*g1*g2))*L # location of ITM relative to the waist
z2 = ((g1*(1-g2))/(g1+g2-2*g1*g2))*L # location of ETM relative to the waist
# The exponential of Eq. 1 of P940008 is expanded to first order; this
# The exponential of Eq. 1 of P940008 is expanded to first order; this
# can be integrated analytically
# can be integrated analytically
@@ -60,3 +56,78 @@ def residual_gas_cavity(f, ifo):
@@ -60,3 +56,78 @@ def residual_gas_cavity(f, ifo):
zint[zint < 0] = 0
zint[zint < 0] = 0
return zint
return zint
 
 
 
def residual_gas_damping_test_mass(f, ifo, species, sustf, squeezed_film):
 
"""Noise due to residual gas damping for one test mass
 
 
:f: frequency array in Hz
 
:ifo: gwinc IFO structure
 
:species: molecular species structure
 
:sustf: suspension transfer function structure
 
:squeezed_film: squeezed film damping structure
 
 
:returns: displacement noise
 
"""
 
sus = ifo.Suspension
 
if 'Temp' in sus.Stage[0]:
 
kT = sus.Stage[0].Temp * const.kB
 
else:
 
kT = sus.Temp * const.kB
 
 
mass = species.mass
 
radius = ifo.Materials.MassRadius
 
thickness = ifo.Materials.MassThickness
 
thermal_vel = sqrt(kT/mass) # thermal velocity
 
 
# pressure in the test mass chambers; possibly different from the pressure
 
# in the arms due to outgassing near the test mass
 
pressure = species.ChamberPressure
 
 
# infinite volume viscous damping coefficient for a cylinder
 
# table 1 of https://doi.org/10.1016/j.physleta.2010.06.041
 
beta_inf = pi * radius**2 * pressure/thermal_vel
 
beta_inf *= sqrt(8/pi) * (1 + thickness/(2*radius) + pi/4)
 
 
force_noise = 4 * kT * beta_inf
 
 
# add squeezed film damping if necessary as parametrized by
 
# Eq (5) of http://dx.doi.org/10.1103/PhysRevD.84.063007
 
if squeezed_film.keys():
 
# the excess force noise and diffusion time are specified directly
 
if 'ExcessDamping' in squeezed_film:
 
# ExcessDamping is the ratio of the total gas damping noise at DC
 
# to damping in the infinite volume limit (in amplitude)
 
DeltaS0 = (squeezed_film.ExcessDamping**2 - 1) * force_noise
 
if DeltaS0 < 0:
 
raise ValueError('ExcessDamping must be > 1')
 
 
try:
 
diffusion_time = squeezed_film.DiffusionTime
 
except AttributeError:
 
msg = 'If excess residual gas damping is given a diffusion ' \
 
+ 'time must be specified as well'
 
raise ValueError(msg)
 
 
# if a gap between the test mass and another object is specified
 
# use the approximate model of section IIIA and B
 
elif 'gap' in squeezed_film:
 
gap = squeezed_film.gap
 
 
# Eq (14)
 
diffusion_time = sqrt(pi/2) * radius**2 / (gap * thermal_vel)
 
diffusion_time /= log(1 + (radius/gap)**2)
 
 
# Eq (11) factoring out the low pass cutoff as in (5)
 
DeltaS0 = 4 * kT * pi*radius**2 * pressure * diffusion_time / gap
 
 
else:
 
raise ValueError('Must specify either excess damping or a gap')
 
 
# Eq (5)
 
force_noise += DeltaS0 / (1 + (2*pi*f*diffusion_time)**2)
 
 
# convert force to displacement noise using the suspension susceptibility
 
noise = force_noise * abs(sustf.tst_suscept)**2
 
 
return noise
Loading