finesse.thermal.hello_vinet module
Hello-Vinet equations for thermal lenses in cylindrical mirrors. Higher order mode thermal effects are not implemented here. Therefore all the functions return some axially symmetric data.
Equations all based on [37]:
Jean-Yves Vinet, “On Special Optical Modes and Thermal Issues in Advanced Gravitational Wave Interferometric Detectors” Living Review 2009
- finesse.thermal.hello_vinet.eval_p_n_s_numerical(result)[source]
Evaluates a Fourier-Bessel decomposition fit performed with
finesse.thermal.hello_vinet.get_p_n_s_numerical().Returns
- I_rndarray
Irradiance from fit
- finesse.thermal.hello_vinet.get_p_n_s(a, w, n, m, chi, eta_n_s, eta_n_s_sq)[source]
Returns beam intensity overlap coefficients as calculated by Eq 3.33 in [37].
Parameters
- afloat
mirror radius
- wfloat
spot size radius
- n, mint
LG mode order
- chifloat
Reduced radiation constant
- eta_n_sarray_like
2D array with dimensions (n_max, s_max) for the n-th order Bessel and the first s zeros of the Bessel equation 3.11 [37]. See
finesse.thermal.hello_vinet.zeros_of_xjn_1_chi_jn()to compute these.- eta_n_s_sqarray_like
Cached (eta_n_s)^2 values
Notes
This is currently limited to computing only the LG00 mode, higher order modes are still on the todo list.
- finesse.thermal.hello_vinet.get_p_n_s_numerical(I, a, s_max, material, barrel_material=None, n_max=0, T_ext=293.15, root_accuracy=1e-6, newton_cotes_order=2)[source]
Performs a Fourier-Bessel decomposition of some axisymmetric irradiance distribution.
Parameters
- Indarray
Axisymmetric irradiance distribution [Wm^-2], defined from r = 0 -> a. Radial point array is internally inferred from the size of I.
- afloat
mirror radius
- s_maxint
Number of zeros in each Bessel expansion
- materialMaterial
Mirror substrate material, see
finesse.materials- barrel_materialMaterial
Barrel coating material, see
finesse.materials- n_maxint, optional
Number of bessel functions to expand with, typically 0
- T_extfloat, optional
External temperature around mirror
- root_accuracyfloat, optional
Absolute accuracy of root Bessel function root finding
- newton_cotes_weightint, optional
Order of newton-cotes weight for integral
Returns
- rndarray
Radial points [m]
- chi_edgefloat
Reduced thermal constant for barrel surface
- chi_facefloat
Reduced thermal constant for end faces
- p_n_sndarray
Fourier-Bessel coefficients
- eta_n_sndarray
Zeros of Bessel function
- Jn_k_ns_r_andarray
Fourier-Bessel expansion bases
Examples
import finesse.materials import finesse.thermal.hello_vinet as hv import numpy as np import matplotlib.pyplot as plt from scipy.special import eval_hermite
finesse.init_plotting() # aLIGO like test mass substrate material = finesse.materials.FusedSilica a = 0.17 h = 0.2 w = 53e-3 r = np.linspace(0, a, 101) # 5th order hermite radial distribution E = eval_hermite(5, np.sqrt(2)*r/w) * np.exp(-(r/w)**2) I = E*E plt.plot(r, I) # perform Fourier-Bessel decomposition fit = hv.get_p_n_s_numerical(I, a, 10, material) plt.plot(r, hv.eval_p_n_s_numerical(fit), ls=’–’, lw=2, label=’s_max=10’) # perform Fourier-Bessel decomposition fit = hv.get_p_n_s_numerical(I, a, 20, material) plt.plot(r, hv.eval_p_n_s_numerical(fit), ls=’–’, lw=2, label=’s_max=20’) plt.legend() plt.xlabel(“r [m]”) plt.ylabel(“I(r) [Wm^-2]”) plt.title(“Fourier-Bessel decomposition of irradiance”)
Notes
This returns beam intensity overlap coefficients as calculated by Eq 3.15 in [37] for an arbitrary radial intensity distribution. Typically n_max=0 and s_max is chosen for the required fit. The integral is performed using composite Newton-Cotes rule, which by default is set to a Simpsons Rule (order 2) which provides better accuracy when fewer sample points in the intensity are present. Higher orders are not necessarily more accurate as over-fitting from using too high a polynomial order can introduce artifacts.
The resulting fit can be compared using the returned values by passing the tuple of results to
finesse.thermal.hello_vinet.eval_p_n_s_numerical(). Comparing the above to the original intensity will show how accurate the fit is and will determine what s_max and weight ordering you should use. Sharp features in the intensity will not fit well.
- finesse.thermal.hello_vinet.ring_radiator_intensity(r, a, b_c, D_c, P_c)[source]
Calculates the intesity of incident on a mirror surface from an ideally thin ring radiator.
Parameters
- rndarray
Radial points [m]
- afloat
Mirror radius
- b_cfloat
Radius of ring radiator (b_c > D_c) [m]
- D_cfloat
Distance from ring radiator to mirror surface [m]
- P_cfloat
Power emitted by ring [W]
Returns
- I_rndarray(shape=(r.size,))
Radial variation in intensity on mirror from ring.
Notes
Solving equation 4.11 [37]
- finesse.thermal.hello_vinet.substrate_temperatures(data, z, h)[source]
Computes the 2D substrate temperature distribution per Watt of absorbed power in each of the coating and substrate for an arbitrary axisymmetric heating irradiance computed with
finesse.thermal.hello_vinet.get_p_n_s_numerical().The HR surface is at z = +h/2 and the AR surface is at z = -h/2.
Parameters
- datatuple
Irradiance fit data from
finesse.thermal.hello_vinet.get_p_n_s_numerical()- zndarray
Longitudinal points, should sample points between -h/2 and h/2. Sampling outside this region will yield incorrect results.
- hfloat
Longitudinal points
Returns
- T_coatndarray(shape=(z.size, r.size))
2D array of temperature in substrate from coating absorption per watt of power absorbed in coating
- T_bulkndarray(shape=(z.size, r.size))
2D array of temperature throughout substrate from bulk absorption per watt of power absorber through the entire substrate.
Notes
This is using equation 3.18 and 3.25 in [37] for \(\phi=0\) with the signs of the axial coordinate switched as noted above.
Currently only works for n_max == 0.
- finesse.thermal.hello_vinet.substrate_temperatures_HG00(r, z, a, h, w, material, barrel_material=None, T_ext=293.15, n_max=0, s_max=10, root_accuracy=1e-6)[source]
Computes the 2D substrate temperature distribution per Watt of absorbed power in each of the coating and substrate from a HG00 beam.
The HR surface is at z = +h/2 and the AR surface is at z = -h/2.
Parameters
- rndarray
Radial points
- zndarray
Longitudinal points, should sample points between -h/2 and h/2. Sampling outside this region will yield incorrect results.
- afloat
mirror radius
- hfloat
mirror thickness
- wfloat
spot size radius
- materialMaterial
Mirror substrate material, see
finesse.materials- barrel_materialMaterial
Barrel coating material, see
finesse.materials- T_extfloat, optional
External temperature surrounding mirror
- n_maxint, optional
Maximum Bessel order for expansion
- s_maxint, optional
Maximum number of zeros to compute
- root_accuracyfloat, optional
Accuracy of root finding
Returns
- T_coatndarray(shape=(z.size, r.size))
2D array of temperature in substrate from coating absorption per watt of power absorbed in coating
- T_bulkndarray(shape=(z.size, r.size))
2D array of temperature throughout substrate from bulk absorption per watt of power absorber through the entire substrate.
Notes
This is using equation 3.18 and 3.25 in [37] for \(\phi=0\) with the signs of the axial coordinate switched as noted above.
Currently only works for n_max == 0.
- finesse.thermal.hello_vinet.substrate_thermal_expansion_depth(data, z, h)[source]
Computes the depth displacements throughout the bulk of an optic due to coating absorption. Displacement is in units of m per absorbed Watts for a custom axisymmetric heating beam, see
finesse.thermal.hello_vinet.get_p_n_s_numerical().The HR surface is at z = +h/2 and the AR surface is at z = -h/2 and the surface normal to the HR surface is positive.
Parameters
- datatuple
Irradiance fit data from
finesse.thermal.hello_vinet.get_p_n_s_numerical()- zndarray
Longitudinal points, should sample points between -h/2 and h/2. Sampling outside this region will yield incorrect results.
- hfloat
mirror thickness
Returns
- U_z_coat_per_Wndarray(shape=(z.size, r.size))
D Array of z displacements throughout the substrate per absorbed Watts of HG00 beam in coating
Notes
Solving equation 3.117 and 3.118 in [37] with the signs of the axial coordinate switched as noted above.
Currently only works for n_max == 0.
- finesse.thermal.hello_vinet.substrate_thermal_expansion_depth_HG00(r, z, a, h, w, material, barrel_material=None, T_ext=293.15, n_max=0, s_max=20, root_accuracy=1e-6)[source]
Computes the depth displacements throughout the bulk of an optic due to coating absorption. Displacement is in units of m per absorbed Watts for a HG00 heating beam.
The HR surface is at z = +h/2 and the AR surface is at z = -h/2 and the surface normal to the HR surface is positive.
Parameters
- rndarray
Radial points
- zndarray
Longitudinal points, should sample points between -h/2 and h/2. Sampling outside this region will yield incorrect results.
- afloat
mirror radius
- hfloat
mirror thickness
- wfloat
spot size radius
- materialMaterial
Mirror substrate material, see
finesse.materials- barrel_materialMaterial
Barrel cotaing material, see
finesse.materials- T_extfloat, optional
External temperature surrounding mirror
- n_maxint, optional
Maximum Bessel order for expansion
- s_maxint, optional
Maximum number of zeros to compute
- root_accuracyfloat, optional
Accuracy of root finding
Returns
- U_z_coat_per_Wndarray(shape=(z.size, r.size))
D Array of z displacements throughout the substrate per absorbed Watts of HG00 beam in coating
Notes
Solving equation 3.117 and 3.118 in [37] with the signs of the axial coordinate switched as noted above.
Currently only works for n_max == 0.
- finesse.thermal.hello_vinet.surface_deformation_coating_heating(data, h)[source]
Computes the depth displacement change of the surface of an optic due to coating absorption. Displacement is in units of m per absorbed Watts for a custom axisymmetric heating profile, see
finesse.thermal.hello_vinet.get_p_n_s_numerical()on how to generate the data for this.The HR surface is at z = +h/2 and the AR surface is at z = -h/2 and the surface normal to the HR surface is positive.
Parameters
- datatuple
Irradiance fit data from
finesse.thermal.hello_vinet.get_p_n_s_numerical()- zndarray
Longitudinal points, should sample points between -h/2 and h/2. Sampling outside this region will yield incorrect results.
- hfloat
mirror thickness
Returns
- U_z_coat_per_Wndarray(shape=(r.size.))
Array of z displacements
Notes
Solving equation 3.121 and 3.122 in [37] with the signs of the axial coordinate switched as noted above.
Currently only works for n_max == 0.
- finesse.thermal.hello_vinet.surface_deformation_coating_heating_HG00(r, a, h, w, material, barrel_material=None, T_ext=293.15, n_max=0, s_max=20, root_accuracy=1e-6)[source]
Computes the depth displacement change of the surface of an optic due to coating absorption. Displacement is in units of m per absorbed Watts for a HG00 heating beam.
The HR surface is at z = +h/2 and the AR surface is at z = -h/2 and the surface normal to the HR surface is positive.
Parameters
- rndarray
Radial points
- afloat
mirror radius
- hfloat
mirror thickness
- wfloat
spot size radius
- materialMaterial
Mirror substrate material, see
finesse.materials- barrel_materialMaterial
Barrel cotaing material, see
finesse.materials- T_extfloat, optional
External temperature surrounding mirror
- n_maxint, optional
Maximum Bessel order for expansion
- s_maxint, optional
Maximum number of zeros to compute
- root_accuracyfloat, optional
Accuracy of root finding per Watt of power absorbed in coating
Returns
- U_z_coat_per_Wndarray(shape=(r.size.))
Array of z displacements
Notes
Solving equation 3.121 and 3.122 in [37] with the signs of the axial coordinate switched as noted above.
Currently only works for n_max == 0.
- finesse.thermal.hello_vinet.surface_deformation_substrate_heating(data, h)[source]
Computes the depth displacement change of the surface of an optic due to bulk absorption from a generic axisymmetric heating profile. Displacement returned is in units of m per absorbed Watts through entire substrate.
The HR surface is at z = +h/2 and the AR surface is at z = -h/2 and the surface normal to the HR surface is positive.
The accuracy of this computation decreases as h/a > 1. The substrate modelled must be disk like. The error is more pronounced towards the edge of the substrate.
Parameters
- datatuple
Irradiance fit data from
finesse.thermal.hello_vinet.get_p_n_s_numerical()- hfloat
mirror thickness
Returns
- U_z_bulk_per_Wndarray(shape=(r.size.))
Array of z displacements per watt of absorbed power through entire substrate [1W/h]
Notes
Solving equation 3.165 [37] with the signs of the axial coordinate switched as noted above.
Currently only works for n_max == 0.
- finesse.thermal.hello_vinet.surface_deformation_substrate_heating_HG00(r, a, h, w, material, barrel_material=None, T_ext=293.15, n_max=0, s_max=20, root_accuracy=1e-6)[source]
Computes the depth displacement change of the surface of an optic due to bulk absorption from a HG00 beam. Displacement returned is in units of m per absorbed Watts through entire substrate.
The HR surface is at z = +h/2 and the AR surface is at z = -h/2 and the surface normal to the HR surface is positive.
The accuracy of this computation decreases as h/a > 1. The substrate modelled must be disk like. The error is more pronounced towards the edge of the substrate.
Parameters
- rndarray
Radial points
- afloat
mirror radius
- hfloat
mirror thickness
- wfloat
spot size radius
- materialMaterial
Mirror substrate material, see
finesse.materials- barrel_materialMaterial
Barrel cotaing material, see
finesse.materials- T_extfloat, optional
External temperature surrounding mirror
- n_maxint, optional
Maximum Bessel order for expansion
- s_maxint, optional
Maximum number of zeros to compute
- root_accuracyfloat, optional
Accuracy of root finding
Returns
- U_z_bulk_per_Wndarray(shape=(r.size.))
Array of z displacements per watt of absorbed power through entire substrate [1W/h]
Notes
Solving equation 3.165 [37] with the signs of the axial coordinate switched as noted above.
Currently only works for n_max == 0.
- finesse.thermal.hello_vinet.thermal_lenses(data, h)[source]
Computes the substrate thermal lens per Watt of absorbed power in each of the coating and substrate for an arbitrary axisymmetric heating irradiance computed with
finesse.thermal.hello_vinet.get_p_n_s_numerical().Parameters
- datatuple
Irradiance fit data from
finesse.thermal.hello_vinet.get_p_n_s_numerical()- hfloat
mirror thickness
Returns
- Z_coatndarray(shape=(r.size,))
Array of optical path difference in bulk from coating absorption per watt of power absorbed in coating
- Z_bulkndarray(shape=(r.size,))
Array of optical path difference in bulk from bulk absorption per watt absorbed through entire substrate [1W/h]
Notes
This is using equation 3.41 and 3.42 in [37] for \(\phi=0\).
Currently only works for n_max == 0.
- finesse.thermal.hello_vinet.thermal_lenses_HG00(r, a, h, w, material, barrel_material=None, T_ext=293.15, n_max=0, s_max=20, root_accuracy=1e-6)[source]
Computes the substrate thermal lens per Watt of absorbed power in each of the coating and substrate from a HG00 beam.
Parameters
- rndarray
Radial points
- afloat
mirror radius
- hfloat
mirror thickness
- wfloat
spot size radius
- materialMaterial
Mirror substrate material, see
finesse.materials- barrel_materialMaterial
Barrel cotaing material, see
finesse.materials- T_extfloat, optional
External temperature surrounding mirror
- n_maxint, optional
Maximum Bessel order for expansion
- s_maxint, optional
Maximum number of zeros to compute
- root_accuracyfloat, optional
Accuracy of root finding
Returns
- Z_coatndarray(shape=(r.size,))
Array of optical path difference in bulk from coating absorption per watt of power absorbed in coating
- Z_bulkndarray(shape=(r.size,))
Array of optical path difference in bulk from bulk absorption per watt absorbed through entire substrate [1W/h]
Notes
This is using equation 3.18 and 3.25 in [37] for \(\phi=0\).
Currently only works for n_max == 0.
- finesse.thermal.hello_vinet.zeros_of_xjn_1_chi_jn(double chi, int n_max, int s_max, double accuracy)[source]
Compute the roots of the equation
\[x J_{n+1}(x) - \chi J_{n}(x) = 0 \]which is used throughout the Hello-Vinet thermal equations.
Parameters
- chifloat
Reduced radiation constant
- n_maxint
Max bessel order to compute up to, must be > 0
- s_maxint
Max number of zeros to compute, must be >= 2
- accuracydouble
absolute error on zero finding brentq algorithm
Returns
- eta_n_sarray_like
Array of s_max zeros for the n_max bessel functions
Notes
This is based on the calculations in [37]. The zeros of this function are used in multiple calculations throughout the text.
This algorithm finds the first two zeros of the 0th order bessel function then from there assumes the next zero is approximately the difference between the last two further away.
For higher order bessels, the zeros are always between the zeros of n-1 zeros which can be used as bounds for root finding.