Skip to content

Instantly share code, notes, and snippets.

@awade
Last active April 6, 2018 02:19
Show Gist options
  • Save awade/fbe4d753181a1f528cd2ef9ed46fbac2 to your computer and use it in GitHub Desktop.
Save awade/fbe4d753181a1f528cd2ef9ed46fbac2 to your computer and use it in GitHub Desktop.
Notebook for computing dimensions when designing vacuum viewports. Please comment if you find errors or have improvements.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"run_control": {
"frozen": false,
"read_only": false
}
},
"source": [
"# Notebook for glass window vacuum flange design\n",
"\n",
"\n",
"This notebook summerizes some common calculations made for the design of vacuum system viewports.\n",
"\n",
"Most of the equations in this notebook are drawn form __[Abbott & Scace in J. Vac. Sci. Technol. A 28, 573 (2010)](http://dx.doi.org/10.1116/1.3442803)__. They mostly pertain to groove dimensions and safe loading and thickness of the glass for vacuum viewports. \n",
"\n",
"Compression as a function of load is less well documented and varies depending on the duro number of the o-ring material and its shape factor. Some allowance should be made in designing vacuum windows for the force applied once the system is under vacuum. For larger windows this extra load will squeeze the o-ring by 5-10 % more than the static in air loading. Allowances must be made in the clearance between glass and metal for viewports larger than 50 mm (2 inch).\n",
"\n",
"You will need to modify dimentions and material properties for your specific application.\n",
"\n",
"Use at your own risk and consult the literature. \n",
"\n",
"\n",
"--------\n",
"| Author | Andrew Wade |\n",
"| :---- | ------|\n",
"| Date | 04 April 2018 | \n",
"| Contact | awade (at) caltech.edu|"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Import useful packages"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"run_control": {
"frozen": false,
"read_only": false
}
},
"outputs": [],
"source": [
"import numpy as np"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Standard physical constants and conversions"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"run_control": {
"frozen": false,
"read_only": false
}
},
"outputs": [],
"source": [
"atm = 101.325e3 # [Pa]\n",
"pounds = 0.45359237 # conversion factor[kg]\n",
"newtons = 9.80655 # conversion factor [ms^-2/kg]\n",
"inchs = 25.4e-3 # conversion factor [m/inch]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Window and oring parameters"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"run_control": {
"frozen": false,
"read_only": false
},
"scrolled": false
},
"outputs": [],
"source": [
"Window_Diameter = 2.0 * 25.4e-3 # window diameter\n",
"Window_Thickness = 9.35e-3 #[m] # Thickness edge of mirror\n",
"Window_wedging = 0.5 * np.pi / 180 # angle wedge on optic [rad] \n",
"Window_TensileStrength = 4.8e7 / newtons #[kg/m^2] This is for fused silica given in Pa and converted to kg/m^2\n",
"Window_YoungsModulus = 71.7e9 # [Pa] Young's modulus of window material (elastic deformation)\n",
"\n",
"ORing_ID = 1.86*25.4e-3 # [m]\n",
"ORing_thickness = 0.139*25.4e-3 # [m]\n",
"ORing_Duro = 70 # [For viton]\n",
"ORing_StretchOnInstall = 0.02\n",
"\n",
"ORing_circumference = (ORing_ID + 1.0 * ORing_thickness)* np.pi"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Computing minimum safe thickness for window\n",
"The minimum thickness of a vacuum window optic is defined by the tensile strength of the glass material, diameter of the window and the method of clamping. A safety factor must also be included to provide a margin of error. It is important to remember that all window optics are as strong as their weakest flaw: each element must be carefully inspected for cracks, chips and scratchs. A good equation given by Abbott and Scace for computing minimum window thickness is \n",
"\n",
"$$t_\\textrm{clamped} = SF_\\textrm{extra}\\left(P\\frac{SF}{\\sigma_f}\\right)^\\frac{1}{2}D$$\n",
"\n",
"where SF is the safety factor (ussually 4), $SF_\\textrm{extra}$ is the additional margin for clamped optics (ussually 0.433 x 1.28), P is the static preasure applied by atmosphere (101 kPa), $\\sigma_f$ is the tensile strength of the window material (4.8e7 Pa for UV fused silica, ??? for BK7), and D is the window diameter.\n",
"\n",
"\n",
"The window itself will deform under preasure between atmosphere and vacuum. The maxmimum deflection of the optic is given by\n",
"\n",
"$$ y_\\textrm{max} = \\frac{P (D/2)^4}{E t^3}$$\n",
"\n",
"where E is the Young's modulus of the material and t is the actual thickness of the window optic at its thinest point. The Young's modulus of UV fused silica is 71.7 GPa, BK7 is 82 GPa and Pyrex is 70 GPa. This maximum deflection is at the center of the optic, the edges will be less. The deflection at the edges of the optic will be smaller but this number should be used as a safe estimate of clearance of the optic from the metal flange. \n",
"\n",
"The cell below computes minimum safe thickness and maximum deflection of the glass under load."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"scrolled": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Kg of force pushing on mirror 20.9420 kg\n",
"Minimum safe window thickness 8.1019 mm (0.3190 inchs)\n",
"Maximum window deflection under load 0.0007 mm (0.0000 inchs)\n"
]
}
],
"source": [
"# Define some safety factors\n",
"SF = 4 # safety factor for unclamped window\n",
"SFextra = 1.28 * 0.433 # Additional safety factor for clamped using screws\n",
"\n",
"Window_Force_1atm = (Window_Diameter/2)**2*np.pi*atm # compute preasure under vacuum due to 1atm of preasure\n",
"Window_ThicknessMinSafe = SFextra * (atm * SF / Window_TensileStrength) ** 0.5 * Window_Diameter\n",
"Window_DeflectionMax = atm * (Window_Diameter/2) ** 4 / (Window_YoungsModulus * Window_Thickness ** 3)\n",
"\n",
"print(\"Kg of force pushing on mirror {0:.4f} kg\".format(Window_Force_1atm/newtons))\n",
"print(\"Minimum safe window thickness {0:.4f} mm ({1:.4f} inchs)\".format(Window_ThicknessMinSafe*1e3,Window_ThicknessMinSafe/inchs))\n",
"print(\"Maximum window deflection under load {0:.4f} mm ({1:.4f} inchs)\".format(Window_DeflectionMax*1e3,Window_DeflectionMax/inchs))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Computing O-ring loadings and groove dimentions\n",
"\n",
"O-rings are squishy and are used seal interfaces when under compression. Under applied compression the rubber material conforms to the surface in contact and fills all the small gaps. Getting to 1e-6 Torr is relativtly easy when following directions of Abbott & Scace.\n",
"\n",
"A rule of thumb is to apply a compression of 72% of the total thickness of an O-ring. Thus, for a metal-to-metal contact the compression ratio (K) should be 0.72 giving a o-ring groove depth of \n",
"\n",
"$$B = K\\cdot d$$\n",
"\n",
"where $d$ is the o-ring thickness, and $B$ is the groove depth. This should create enough contact area between rubber, glass and metal to form a good seal in most situations. When making glass to metal interfaces a clearance of 0.5 mm should be left on each side to ensure they don't ever touch. Make the groove shallower by that amount to ensure that the 72% compression point is reached when assembled.\n",
"\n",
"People use Neoprene, buna, viton and other materials for orings. Viton of duro 70 is good for most applications. As for O-ring size, many commercial demountable viewports under 38.1 mm (1.5 inch) use 0.07 inch thickness o-rings. Some LIGO designed viewports of 6 inches and above use thickness 0.138 inch o-rings. Thicker is a little better but it will require more of the view area of the optic. A good reference table with o-ring sizes can be found in the __[EPM Oring Handbook](https://www.physics.harvard.edu/uploads/files/machineshop/epm_oring_handbook.pdf)__, starting at page 114.\n",
"\n",
"Once the o-ring is installed into the groove and compressed, one needs to leave enough volume in the groove for the oring to deform into. If the groove is too narrow it will muffin-top out of the groove, damaging the o-ring and risking extreem presure points and failure of the assembly. Abbott & Scace recommend a dead volume of 5%. This leads to a oring to groove crosssection ratio (k) of 1.05. The groove width must therefore be:\n",
"\n",
"$$A = k \\left(\\frac{\\pi d^2}{4}\\right)/B$$\n",
"\n",
"where A is the groove width and other parameters are as above. \n",
"\n",
"One issue not address here, or much anywhere else, is the extra loading applied by atmospheric preasure to the vacuum side seal. For optics under 50 mm (2 inch) extra deformation of a 70 duro oring is less than 5-10%. Leaving a 0.5 mm margin gap in the assembly between glass and metal should be enough to account for this. Larger viewports may need to take this into account. There isn't a lot of data/rules of thumb for elastic deformation as a function of force of o-rings, its geometry dependant and variation in o-ring batches leads to some largish error bars. See tables 2.3 to 2.8 in the __[Parker O-ring Handbook](https://www.parker.com/literature/ORD%205700%20Parker_O-Ring_Handbook.pdf)__ for a rough guide to deformation of o-rings under compressive load. There is also a good reference on o-ring compression force on the __[Parker website](https://promo.parker.com/promotionsite/oring-ehandbook/us/ehome/ci.O%E2%80%93Ring-Compression-Force,EN.EN)__\n",
"\n",
"The cell below computes the load due to one atm of preasure and best o-ring grove dimentions for metal-to-metal contact. For glass-to-metal contact allow extra clearance of 0.5 mm and make the groove shallower accordingly. "
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"O-ring effective circumference 0.1595 m\n",
"O-ring load under 1 atm 1287.4712 N/m (7.3517 Lb/In)\n",
"Best grove depth (B) 2.5420 mm (0.1001 in)\n",
"Best grove width (A) 4.0439 mm (0.1592 in)\n"
]
}
],
"source": [
"K = 0.72 # Compression ratio (vertical)\n",
"k = 1.05 # dead volume factor\n",
"\n",
"Window_Force_1atm = (Window_Diameter/2)**2*np.pi*atm # compute preasure under vacuum due to 1atm of preasure\n",
"ORing_loadPerMeter = Window_Force_1atm / ORing_circumference\n",
"\n",
"B = ORing_thickness * K\n",
"A = k * np.pi * (ORing_thickness ** 2) / 4 / B\n",
"\n",
"print(\"O-ring effective circumference {0:.4f} m\".format(ORing_circumference))\n",
"print(\"O-ring load under 1 atm {0:.4f} N/m ({1:.4f} Lb/In)\".format(ORing_loadPerMeter, ORing_loadPerMeter*inchs/pounds/newtons))\n",
"\n",
"print(\"Best grove depth (B) {0:.4f} mm ({1:.4f} in)\".format(B*1.0e3,B/25.4e-3))\n",
"print(\"Best grove width (A) {0:.4f} mm ({1:.4f} in)\".format(A*1.0e3,A/25.4e-3))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Further considerations for choice of O-ring\n",
"For a useable design there are a few more considerations. Ideally one would use a dovetail or half dove-tail groove to retain the o-ring in place. These types of groves have angled walls that pitch inwards. The oring will then be retained when the viewport is disassembled. However this can be hard to machine for smaller diameter grooves. \n",
"\n",
"If you are designing a viewport o-ring groove with strait walls you will want to ideally design the inner grove diameter (ID) to give a 2% stretch (min 1% max 5 %) on the o-ring. This will mean the o-ring is not loose and will hold in place while other elements brought together in the assembly. Its less good than a dove-tail groove, but good enought for assemblies that are rarely pulled appart. Here the groove ID is given by\n",
"\n",
"$$\\textrm{ID}_\\textrm{Groove} = (1-0.02) \\textrm{ID}_\\textrm{o-ring}$$\n",
"\n",
"where $\\textrm{ID}_\\textrm{o-ring}$ is the inner diameter of the o-ring.\n",
"\n",
"Also, the depth of the O-ring groove must be greater than half of the uncompressed o-ring. A groove that is too shallow will contact the o-ring at a non-normnal angle and tend to push it out. As mentioned in the above sections the o-ring groove needs to be made a little shallower than the 0.72 compression point to leave clearance between the glass viewport and the metal of the retaining flange when assembled. This places a lower bound on the o-ring width.\n",
"\n",
"$$ K\\cdot d - C_\\textrm{glass-metal}\\ge 0.5 d $$\n",
"\n",
"where $K$ is the o-ring compression ratio, $d$ is the o-ring width and $C_\\textrm{glass-metal}$ is the glass to metal clearance. Thus the minimum o-ring width, $d_\\textrm{min}$, is \n",
"\n",
"$$ d_\\textrm{min} \\ge \\frac{C_\\textrm{glass-metal}}{K-0.5} $$\n",
"\n",
"This requirment can help narrow the search for o-rings (there a many sizes) to ones that are sensible for the given design.\n",
"\n",
"\n",
"The cell below computes the inner diameter (ID) of the groove for the ideal 2% stretch and the minimum o-ring thickness for a given required clearance of glas"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Specified clearance between viewport and metal 0.5000 mm (0.0197 in)\n",
"Best grove inner diameter (ID) 46.2991 mm (1.8228 in)\n",
"Smallest useable o-ring thickness (d) 2.2727 mm (0.0895 in)\n"
]
}
],
"source": [
"Clearance_GlassToMetal = 0.5e-3 # [m] clearance between viewport optic and metal flange (0.5 mm is a good value)\n",
"\n",
"ID_Groove = (1-ORing_StretchOnInstall) * ORing_ID\n",
"ORing_minthickness = Clearance_GlassToMetal/(K-0.5)\n",
"\n",
"print(\"Specified clearance between viewport and metal {0:.4f} mm ({1:.4f} in)\".format(Clearance_GlassToMetal*1.0e3,Clearance_GlassToMetal/25.4e-3))\n",
"print(\"Best grove inner diameter (ID) {0:.4f} mm ({1:.4f} in)\".format(ID_Groove*1.0e3,ID_Groove/25.4e-3))\n",
"print(\"Smallest useable o-ring thickness (d) {0:.4f} mm ({1:.4f} in)\".format(ORing_minthickness*1.0e3,ORing_minthickness/25.4e-3))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"language": "python",
"name": "python2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.14"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment