Skip to content

Instantly share code, notes, and snippets.

@tobin
Created August 28, 2011 08:17
Show Gist options
  • Save tobin/1176399 to your computer and use it in GitHub Desktop.
Save tobin/1176399 to your computer and use it in GitHub Desktop.
Technical radiation pressure noise budget
%% Technical radiation pressure noise budget
%
% Produce a noise budget showing shot noise, quantum radiation pressure
% noise, and technical radiation pressure noise in a FP Michelson IFO.
%
% Reference: Chaibi and Bondu pre-print
%
% Tobin Fricke
% August 27, 2011
% convention dx = EX displacement - EY displacement
%% Parameters
ifo = 'ELIGO';
f = logspace(0, 4, 101);
doUseStrain = true; % true = strain, false = displacement
switch ifo
case 'VIRGO' % Advanced VIRGO parameters
m = 40; % mass of test mass [kg]
L = 3000; % arm length [m]
F = 400; % finesse
dx = 2*10e-12; % arm cavity detuning [m]
PIN = 140; % incident power [W]
Grc = 50; % power recycling gain
w_pend = 2*pi*0.6; % pendulum resonance [rad/s]
Q_pend = 50; % pendulum Q factor
case 'ELIGO' % Enhanced LIGO parameters (LLO)
m = 10.5; % mass of test mass [kg]
L = 3995; % arm length [m]
F = 220; % finesse
dx = 7e-12; % arm cavity detuning [m]
PIN = 6.6; % incident power [W]
Grc = 36; % power recycling gain
w_pend = 2*pi*0.75; % pendulum resonance [rad/s]
Q_pend = 50; % pendulum Q factor
otherwise
error('Unknown configuration');
end
lambda = 1064e-9; % laser wavelength [m]
fcc = 1; % coupled cavity pole [Hz]
%% Constants
c = 299792458; % speed of light [m/s]
h = 6.62606891e-34; % planck's constant
%% Derived parameters
PBS = Grc * PIN; % power at the beam splitter
fsr = c / (2 * L); % free spectral range [Hz]
fc = fsr / F / 2; % cavity pole [Hz]
xp = lambda / F; % linewidth [m]
nu = c/lambda; % optical frequency
phase_gain = (2/pi) * F; % arm cavity phase gain
gcr = sqrt(phase_gain); % arm intra-cavity amplitude gain
k_mech = m * w_pend^2; % mechanical spring constant (approx 5e2)
k_opt = 2 * 64 * F^2 * gcr^2 * ...
(PBS/2) / (c * lambda^2) * (dx/2); % optical spring const (approx 2e5)
%% Mechanical transfer functions
s = 2*pi*1i*f;
H_x = 1./(m*s.^2 + (m*w_pend/Q_pend)*s + k_mech + k_opt);
H_y = 1./(m*s.^2 + (m*w_pend/Q_pend)*s + k_mech - k_opt);
H_darm = H_x - H_y;
if false
a = subplot(2,1,1);
loglog(f, abs(H_x), f, abs(H_y), f, abs(H_darm));
legend('X', 'Y', 'X-Y');
ylabel('meters per Newton');
a(2) = subplot(2,1,2);
angled = @(x) angle(x)*180/pi;
semilogx(f, angled(H_x), f, angled(H_y), f, angled(H_darm));
set(gca, 'ytick', 45 * (-4:4));
ylabel('degrees');
xlabel('frequency [Hz]');
linkaxes(a, 'x');
xlim([1 10]);
end
%% Calculations
% DC power at AS port due to detuning
PAS = PBS * sin(phase_gain * (2*pi/lambda) * dx)^2;
% optical gain (sensing function) [W/meter]
S = 2 * sqrt(PAS * PBS) * phase_gain * (2*pi/lambda);
% quantum shot noise [m/rtHz]
qsn = sqrt(2*h*nu*PAS) / S .* abs(1 + 1i*f/fc);
% quantum radiation pressure noise [m/rtHz] -- assuming no detuning!
qrp = sqrt(2) * sqrt(2*h*nu*(PBS/2)*gcr^2) * (2/c) ./ (m*abs(1 + 2i*pi*f/w_pend).^2);
%qrp_detuned = sqrt(2) * sqrt(2*h*nu*(PBS/2)*gcr^2) * (1/c) .* abs(H_darm);
qtotal = sqrt(qrp.^2 + qsn.^2);
% radiation pressure noise due to RIN
rinrp = PBS * gcr^2 * (2/c) ./ abs(1 + 1i*f/fcc) .* abs(H_darm); % m per RIN
% plotting
clf;
if doUseStrain
calib = 1/L;
else
calib = 1;
end
loglog(result(1).f, sqrt(result(1).Pxx), 'linewidth', 3, 'color', 0.6*[1 1 1]);
hold all
loglog(f, calib * qtotal, 'k', 'linewidth', 2);
%hold all
%loglog(f, calib * qsn, 'k--');
%loglog(f, calib * qrp, 'k--' );
%loglog(f, calib * qrp_detuned, '--', 'color', 0.6*[1 1 1], 'linewidth', 2);
loglog(f, calib * rinrp * 1e-8, 'r', 'linewidth', 2);
loglog(f, calib * rinrp * 1e-9, 'b', 'linewidth', 2);
hold off
xlim([1 1e4]);
%ylim([1e-25 1e-18]);
grid on
%legend('total quantum noise', 'shot noise', 'quant rad pres noise (no cavity detuning)', ...
% 'tech rad pres due to 10e-8 RIN laser AM', 'tech rad pres due to 10e-9 RIN laser AM');
if doUseStrain
ylabel('(delta L / L) [Hz^{-1/2}]');
else
ylabel('displacement ASD [m Hz^{-1/2}]');
end
xlabel('frequency [Hz]');
title(sprintf('%s using DC readout with dL = %d pm', ifo, dx*1e12));
fontsize = 16;
set([gca; findall(gca, 'Type','text')], 'FontSize', fontsize);
orient landscape
print(gcf, '-dpdf', sprintf('radnoise-%s.pdf', ifo));
%% OPTICKLE
sweepSetup
opt = addProbeOut(opt, 'AM DC', 'AM', 'out', 0, 0);
pos(nEX) = dx/2;
pos(nEY) = -dx/2;
[fDC, sigDC, sigAC, mMech, noiseAC] = tickle(opt, pos, f);
%%
nOMCprobe = getProbeNum(opt, 'OMCT DC');
nAMdrive = getDriveNum(opt, 'AM');
fprintf('\nOptickle says P_AS = %f W\n', sigDC(nOMCprobe));
fprintf('Model says P_AS = %f W\n', PAS);
S = getTF(sigAC, nOMCprobe, nEX) - ...
getTF(sigAC, nOMCprobe, nEY);
S = S / 2; % KLUDGE
hold all
loglog(f, abs(noiseAC(nOMCprobe,:).' ./ S) / 3995, 'k--', 'linewidth', 2);
% Optickle is known (to me) to under-estimate radiation pressure by a
% factor of 2, so I add the first factor of two. The second factor of 0.5
% is to convert from relative intensity to relative amplitude.
loglog(f, abs(2 * 0.5 * 1e-8 * getTF(sigAC, nOMCprobe, nAMdrive) ./ S) / 3995, 'r--', 'linewidth', 2);
loglog(f, abs(2 * 0.5 * 1e-9 * getTF(sigAC, nOMCprobe, nAMdrive) ./ S) / 3995, 'b--', 'linewidth', 2);
% naive_shot_noise = sqrt(2 * h * nu * sigDC(nOMCprobe)) ./ S / 3995;
% loglog(f, abs(naive_shot_noise), '--', 'color', 0.6*[1 1 1], 'linewidth', 2);
hold off
xlim([1 1e4]);
ylim([1e-27 1e-17]);
legend('S6 h(t) ASD', 'model quantum', 'model RIN 1e-8', 'model RIN 1e-9', ...
'Optickle quantum', 'Optickle 1e-8', 'Optickle 1e-9');
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment