Skip to content
Snippets Groups Projects
Commit 080b9fb9 authored by Jameson Graef Rollins's avatar Jameson Graef Rollins
Browse files

suspension thermal noise simplification

new suspension_thermal() function for calculating thermal noise of a
single suspended optic.

ifo SuspensionThermal Noise class modified to handle specific case of
Fabry-Perot Michelson.
parent edb7fcc2
No related branches found
No related tags found
No related merge requests found
......@@ -103,7 +103,8 @@ class SuspensionThermal(nb.Noise):
)
def calc(self):
return noise.suspensionthermal.susptherm(self.freq, self.ifo)
n = noise.suspensionthermal.suspension_thermal(self.freq, self.ifo.Suspension)
return n * 4 * self.ifo.gwinc.dhdl_sqr
class CoatingBrownian(nb.Noise):
......
'''Functions to calculate suspension thermal noise
'''
from __future__ import division
from numpy import pi, imag, zeros
import numpy as np
from numpy import pi, imag, zeros
from .. import const
def susptherm(f, ifo):
"""Suspention thermal noise.
def suspension_thermal(f, sus):
"""Suspention thermal noise for a single suspended test mass
'Temp' must either be set for each stage individually, or globally
in ifo.Suspension.Temp. The latter will be preferred if
specified, so if you wish to use per-stage tempurature you must
remove Suspension.Temp.
:f: frequency array in Hz
:sus: gwinc suspension structure
:returns: displacement noise power spectrum at :f:
:Temp: must either be set for each stage individually, or globally
in :sus.Temp:. The latter will be preferred if specified, so if
you wish to use per-stage tempurature you must remove :sus.Temp:.
Assumes suspension transfer functions and V-H coupling have been
pre-calculated and populated into the relevant `ifo` struct
fields.
pre-calculated and populated into the relevant `sus` fields.
"""
# Assign Physical Constants
kB = const.kB
# and vertical to beamline coupling angle
theta = ifo.Suspension.VHCoupling.theta
theta = sus.VHCoupling.theta
noise = zeros((1, f.size))
# if the temperature is uniform along the suspension
if 'Temp' in ifo.Suspension:
if 'Temp' in sus:
##########################################################
# Suspension TFs
##########################################################
hForce = ifo.Suspension.hForce
vForce = ifo.Suspension.vForce
hForce = sus.hForce
vForce = sus.vForce
##########################################################
# Thermal Noise Calculation
......@@ -46,7 +52,7 @@ def susptherm(f, ifo):
# thermal noise (m^2/Hz) for one suspension
w = 2*pi*f
noise = 4 * kB * ifo.Suspension.Temp * abs(imag(dxdF)) / w
noise = 4 * kB * sus.Temp * abs(imag(dxdF)) / w
# if the temperature is set for each suspension stage
else:
......@@ -54,15 +60,15 @@ def susptherm(f, ifo):
# Suspension TFs
##########################################################
hForce = ifo.Suspension.hForce_singlylossy[:, :]
vForce = ifo.Suspension.vForce_singlylossy[:, :]
hForce = sus.hForce_singlylossy[:, :]
vForce = sus.vForce_singlylossy[:, :]
##########################################################
# Thermal Noise Calculation
##########################################################
dxdF = zeros(hForce.shape, dtype=complex)
for n, stage in enumerate(reversed(ifo.Suspension.Stage)):
for n, stage in enumerate(reversed(sus.Stage)):
# add up the contribution from each stage
# convert to beam line motion. theta is squared because
......@@ -74,7 +80,4 @@ def susptherm(f, ifo):
w = 2*pi*f
noise += 4 * kB * stage.Temp * abs(imag(dxdF[n, :])) / w
# 4 masses, turn into gravitational wave strain
noise *= 4 * ifo.gwinc.dhdl_sqr
return np.squeeze(noise)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment