Adding Hong et al. calculations for Coating Brownian Noise
Modified getCoatBrownian() to accept different Bulk and Shear Loss Angles and calculate brownian noise using Hong et a. PRD 87, 082001 (2013).
Function Description:
This function calculates Coating ThermoOptic noise using Hong et al . PRD 87, 082001 (2013). All references to 'the paper', 'Eq' adn 'Sec' are to this paper.
Important Note
Inside this function phi is used for denoting the phase shift suffered by light in one way propagation through a layer. This is in conflict with present nomenclature everywhere else where it is used as loss angle.
The layers are assumed to be alernating low-n high-n layers, with low-n first. Inputs:
f = frequency vector in Hz ifo = parameter struct from IFOmodel.m wBeam = beam radius (at 1 / e^2 power) dOpt = the optical thickness, normalized by lambda, of each coating layer.
New required arguments:
mTi = Mirror Transmittance Ic = Circulating Laser Power falling on the Mirror (W)
The following new arguments should be made available in the Materials object and lines 112-114 and 120-122 should be uncommented:
lossBlown = Coating Bulk Loss Angle of Low Refractive Index layer lossSlown = Coating Shear Loss Angle of Low Refractive Index layer lossBhighn = Coating Bulk Loss Angle of High Refractive Index layer lossShighn = Coating Shear Loss Angle of High Refractive Index layer PETlown = Relevant component of Photoelastic Tensor of High n layer* PEThighn = Relevant component of Photoelastic Tensor of Low n layer*
Returns:
SbrZ = Brownian noise spectra for one mirror in m^2 / Hz
*Default values of PETlown and PEThighn are chosen from sec. A.1. to get the longitudnal coefficent of photoelasticity as -0.5 as been asserted by the paper there for Tantala and -0.27 for Silica. These values also need to be added in Materials object.
The test job failed at a later stage of uploading artifacts and the part of calculation of noise ran without any errors or warnings.
Merge request reports
Activity
added 26 commits
-
fd235ed4...a837d54d - 25 commits from branch
gwinc:master
- 00e5d3db - Merge branch 'master' of https://git.ligo.org/gwinc/pygwinc
-
fd235ed4...a837d54d - 25 commits from branch
added 1 commit
- e879b168 - Corrected calculation of derivatives of complex reflectivity
I updated my fork with the present pygwinc master and made some changes to the code. I found that I was unable to reproduce fig 5 from Hong et al. paper. I found a slightly more computationally brute force but the correct way of writing the code for calculating derivatives of the total complex reflectivity of the coating with respect of phase shift due to each layer and reflectivities of each interface. These corrections have been added and the fig 5 of the paper can be reproduced now. This doesn't change the final result though and hence this error was hard to detect. But now, I am almost certain that this code correctly implements the paper's calculation for calculating coating brownian noise with different shear and bulk loss angles.
CoatingBrownianNoiseComparisonWithOld.pdf I'm attaching a comparison plot here. Note, here the bulk and shear values were still kept the same in the Hong et al. calculations and in the gwinc calculations, I have kept the Phihighn_slope and Philown_slope zero. Otherwise, it would be comparing apples and oranges. Now, I do see a difference in overall level of noise but dependence on f is the same. The minute difference could be coming in through photoelastic effect considerations or due to differences in transfer functions of bulk and shear noise fields to phase noise of layer thickness and surface height fluctuations (Table I in Hong et al.). But honestly, as the paper is very convoluted, it is hard to figure out 'rolling back which thing in the calculation will make it the same as yours'.
If we would like to add the ability to provide frequency-dependent loss angles, I do have a code for that. This code, however, takes the loss angles as python function definitions instead of a float number and that would be hard to feed in through the yaml files that is being done right now. Another way could be to have a fixed model of dependence (polynomial or exponential) and provide coefficients for that. I think that's what is being done right now but just from staring at the code, I couldn't figure out what the Phihighn_slope and Philown_slope refer to actually. But I thought we are not so sure yet of the model of frequency dependence of these loss angles.
mentioned in issue #38 (closed)
I made a comment in #38 (closed) about some of these issues. The upshot is that I think your new code should go into a separate function, so that the aLIGO calculation still uses the existing
getCoatBrownian
function, while at the same time anyone who wants to can use the new Hong calculation. The fact that the Hong calculation gives a different answer than the existing calculation is what is breaking the build right now (it fails on the comparison between the pygwinc and matgwinc aLIGO curves).Edited by Evan Halladded 9 commits
-
357622d5...f22551c6 - 7 commits from branch
gwinc:master
- 0d9c348c - Merge branch 'master' of https://git.ligo.org/gwinc/pygwinc
- 02ddbc9c - Added new requested modifications.
-
357622d5...f22551c6 - 7 commits from branch
I updated my fork with the present pygwinc master and made the requested changes to the code. For using Hong et al. calculations, one would need to use coatbrownianhong instead of coatbrownian. But additional requirements on the Materials object for calculations are mandatory now. The following new arguments should be made available in the Materials object without which this function can not be used:
lossBlown = Coating Bulk Loss Angle of Low Refractive Index layer lossSlown = Coating Shear Loss Angle of Low Refractive Index layer lossBhighn = Coating Bulk Loss Angle of High Refractive Index layer lossShighn = Coating Shear Loss Angle of High Refractive Index layer PETlown = Relevant component of Photoelastic Tensor of High n layer* PEThighn = Relevant component of Photoelastic Tensor of Low n layer* ^ lossBlown, lossSlown, lossBhighn and lossShighn can be string containing python expression to provide dependence on frequency. The expression should be a valid python expression and must have a single variable 'f' for frequency. Ex: '(0.22)*1e-3 + (f - 1000)/1000 * (0.13) * 1e-3' * Choice of PETlown and PEThighn can be inspired from sec. A.1. of the paper. There, values are chosen to get the longitudinal coefficient of photoelasticity as -0.5 for Tantala and -0.27 for Silica. These values also need to be added in Materials object.
The pipeline passes now of course as it is built for the old code which is intact. All changes in this merge request are now strictly additions (no amendments).
assigned to @jameson.rollins
added 61 commits
-
02ddbc9c...078396f1 - 60 commits from branch
gwinc:master
- 7e0b5b1b - Merged all other commits from https://git.ligo.org/gwinc/pygwinc
-
02ddbc9c...078396f1 - 60 commits from branch
added 1 commit
- 5f664c28 - Renamed function and variables to match new coding style of rest of the code
added 1 commit
- e882cb53 - Made use of eval more secure with whitelists and blacklists
added 1 commit
- c2c86c63 - Added extra required fields for coating_brownian_hong
added 4 commits
-
c2c86c63...1de6518b - 3 commits from branch
gwinc:master
- f802952e - Merge branch 'master' of https://git.ligo.org/gwinc/pygwinc
-
c2c86c63...1de6518b - 3 commits from branch