armando-torres-site/torque-spec-calculator.html
2026-07-21 08:44:34 +00:00

463 lines
17 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>TORQUE SPEC ENGINE | Armando Torres</title>
<meta property="og:type" content="website">
<meta property="og:title" content="TORQUE SPEC ENGINE | Armando Torres">
<meta property="og:description" content="TORQUE SPEC PRELOAD ENGINE FOR HIGH-STRESS FASTENER ASSEMBLIES ARMANDO TORRES GARLAND, TEXAS EST. 2026 INPUT SPECIFICATIONS BOLT GRADE (ISO 898) 8.8 —…">
<meta property="og:url" content="https://armando-torres.4ort.net/torque-spec-calculator.html">
<meta name="twitter:card" content="summary">
<meta name="description" content="TORQUE SPEC PRELOAD ENGINE FOR HIGH-STRESS FASTENER ASSEMBLIES ARMANDO TORRES GARLAND, TEXAS EST. 2026 INPUT SPECIFICATIONS BOLT GRADE (ISO 898) 8.8 —…">
<style>
:root {
--paper: #f4f1ea;
--ink: #1a1a1a;
--grid: #2a2a2a;
--accent: #cc3300;
--highlight: #0066cc;
}
* { box-sizing: border-box; }
body {
font-family: 'IBM Plex Mono', 'Courier New', monospace;
background: var(--paper);
color: var(--ink);
margin: 0;
padding: 2rem;
line-height: 1.5;
font-size: 0.95rem;
background-image:
linear-gradient(var(--grid) 1px, transparent 1px),
linear-gradient(90deg, var(--grid) 1px, transparent 1px);
background-size: 40px 40px;
}
.blueprint-frame {
max-width: 960px;
margin: 0 auto;
border: 3px solid var(--ink);
padding: 2rem;
background: var(--paper);
position: relative;
}
.blueprint-frame::before {
content: "DRAWING: TORQUE-SPEC-CALC-V1 | REV: A | DATE: 2026-07-20";
position: absolute;
top: -1.2rem;
left: 2rem;
background: var(--paper);
padding: 0 1rem;
font-size: 0.75rem;
letter-spacing: 2px;
border: 1px solid var(--ink);
}
.header {
border-bottom: 3px double var(--ink);
padding-bottom: 1rem;
margin-bottom: 2rem;
display: grid;
grid-template-columns: 1fr 1fr;
gap: 2rem;
align-items: end;
}
h1 {
margin: 0;
font-size: 2.2rem;
text-transform: uppercase;
letter-spacing: 6px;
line-height: 1;
}
.subtitle {
font-size: 0.85rem;
letter-spacing: 3px;
color: var(--accent);
margin-top: 0.5rem;
}
.author-block {
text-align: right;
font-size: 0.8rem;
}
.author-name {
font-size: 1.1rem;
font-weight: bold;
text-transform: uppercase;
}
.section {
margin-bottom: 2.5rem;
padding: 1.5rem;
border: 2px solid var(--ink);
position: relative;
}
.section::after {
content: "";
position: absolute;
bottom: -6px;
right: -6px;
width: 12px;
height: 12px;
background: var(--ink);
}
.section-title {
font-size: 1.3rem;
text-transform: uppercase;
letter-spacing: 4px;
margin-bottom: 1.5rem;
padding-bottom: 0.5rem;
border-bottom: 1px solid var(--ink);
display: flex;
align-items: center;
}
.section-title::before {
content: "§";
font-size: 1.8rem;
margin-right: 1rem;
color: var(--accent);
}
.input-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 1.5rem;
margin-bottom: 2rem;
}
.field {
display: flex;
flex-direction: column;
}
label {
font-size: 0.75rem;
text-transform: uppercase;
letter-spacing: 2px;
margin-bottom: 0.5rem;
font-weight: bold;
}
input, select {
font-family: inherit;
font-size: 1.1rem;
padding: 0.8rem;
border: 2px solid var(--ink);
background: transparent;
color: var(--ink);
outline: none;
}
input:focus, select:focus {
border-color: var(--accent);
box-shadow: 0 0 0 3px rgba(204,51,0,0.1);
}
.calc-button {
background: var(--ink);
color: var(--paper);
border: none;
padding: 1.2rem 3rem;
font-family: inherit;
font-size: 1.2rem;
text-transform: uppercase;
letter-spacing: 4px;
cursor: pointer;
transition: all 0.2s;
margin: 2rem 0;
}
.calc-button:hover {
background: var(--accent);
transform: translate(-2px, -2px);
box-shadow: 4px 4px 0 var(--ink);
}
.results-panel {
border: 3px double var(--ink);
padding: 2rem;
margin-top: 2rem;
background: rgba(204,51,0,0.03);
}
.result-row {
display: grid;
grid-template-columns: 1fr 2fr;
gap: 2rem;
padding: 1rem 0;
border-bottom: 1px dashed var(--ink);
font-size: 1.1rem;
}
.result-row:last-child {
border-bottom: none;
}
.result-label {
font-size: 0.8rem;
text-transform: uppercase;
letter-spacing: 2px;
color: var(--accent);
}
.result-value {
font-size: 1.5rem;
font-weight: bold;
}
.formula-display {
background: var(--ink);
color: var(--paper);
padding: 1.5rem;
margin: 2rem 0;
font-size: 1.2rem;
text-align: center;
letter-spacing: 3px;
}
.annotation {
font-size: 0.8rem;
color: var(--highlight);
margin-top: 1rem;
padding: 1rem;
border-left: 3px solid var(--highlight);
}
.spec-table {
width: 100%;
border-collapse: collapse;
margin: 2rem 0;
}
.spec-table th, .spec-table td {
border: 1px solid var(--ink);
padding: 0.8rem;
text-align: left;
font-size: 0.85rem;
}
.spec-table th {
background: var(--ink);
color: var(--paper);
text-transform: uppercase;
letter-spacing: 2px;
}
.warning-banner {
background: var(--accent);
color: var(--paper);
padding: 1rem;
margin: 2rem 0;
font-size: 0.9rem;
letter-spacing: 1px;
}
.nav-rail {
display: flex;
justify-content: space-between;
border-top: 3px double var(--ink);
padding-top: 1.5rem;
margin-top: 3rem;
}
.nav-rail a {
color: var(--ink);
text-decoration: none;
font-size: 0.85rem;
text-transform: uppercase;
letter-spacing: 3px;
}
.nav-rail a:hover {
color: var(--accent);
}
</style>
</head>
<body>
<div class="blueprint-frame">
<div class="header">
<div>
<h1>TORQUE SPEC</h1>
<div class="subtitle">PRELOAD ENGINE FOR HIGH-STRESS FASTENER ASSEMBLIES</div>
</div>
<div class="author-block">
<div class="author-name">ARMANDO TORRES</div>
<div>GARLAND, TEXAS</div>
<div>EST. 2026</div>
</div>
</div>
<div class="section">
<div class="section-title">INPUT SPECIFICATIONS</div>
<div class="input-grid">
<div class="field">
<label>BOLT GRADE (ISO 898)</label>
<select id="boltGrade">
<option value="8.8">8.8 — Medium Carbon Steel</option>
<option value="10.9" selected>10.9 — Boron Alloy (Head Gasket Standard)</option>
<option value="12.9">12.9 — Maraging Steel</option>
</select>
</div>
<div class="field">
<label>NOMINAL DIAMETER (mm)</label>
<input type="number" id="diameter" placeholder="e.g., 12" step="0.1" value="12">
</div>
<div class="field">
<label>THREAD PITCH (mm)</label>
<input type="number" id="pitch" placeholder="e.g., 1.5" step="0.1" value="1.75">
</div>
<div class="field">
<label>TARGET PRELOAD (kN)</label>
<input type="number" id="preload" placeholder="e.g., 45" step="0.1" value="45">
</div>
<div class="field">
<label>COEFFICIENT OF FRICTION (µ)</label>
<input type="number" id="friction" placeholder="e.g., 0.15" step="0.01" value="0.14">
</div>
<div class="field">
<label>NUT FACTOR (K)</label>
<input type="number" id="nutFactor" placeholder="Auto-calc" readonly style="background:#ddd;" value="0.20">
</div>
</div>
<button class="calc-button" onclick="calculateTorque()">COMPUTE TORQUE</button>
<div class="formula-display">
T = (K × d × F) + (0.16 × p × F)
</div>
<div class="results-panel" id="resultsPanel" style="display:none;">
<div class="result-row">
<div class="result-label">REQUIRED TORQUE</div>
<div class="result-value"><span id="torqueResult">0</span> N·m</div>
</div>
<div class="result-row">
<div class="result-label">TORQUE RANGE (±5%)</div>
<div class="result-value"><span id="rangeMin">0</span><span id="rangeMax">0</span> N·m</div>
</div>
<div class="result-row">
<div class="result-label">STRESS AREAS (mm²)</div>
<div class="result-value"><span id="stressArea">0</span></div>
</div>
<div class="result-row">
<div class="result-label">PROOF LOAD (MPa)</div>
<div class="result-value"><span id="proofLoad">0</span></div>
</div>
<div class="result-row">
<div class="result-label">SAFETY FACTOR</div>
<div class="result-value"><span id="safetyFactor">0.00</span>x</div>
</div>
</div>
<div class="warning-banner" id="warningBanner" style="display:none;">
⚠️ WARNING: Calculated torque exceeds 85% of proof load threshold. Consider grade upgrade or diameter increase.
</div>
<div class="annotation">
<strong>FIELD CALIBRATION NOTE:</strong> Friction coefficient varies by lubrication regime. Dry steel: µ≈0.18. Molybdenum: µ≈0.12. Factory wet-assemble: µ≈0.14. <em>Always measure µ on your actual batch before trusting the calc.</em>
</div>
</div>
<div class="section">
<div class="section-title">GRADE CONSTANTS TABLE</div>
<table class="spec-table">
<thead>
<tr>
<th>GRADE</th>
<th>TENSILE (MPa)</th>
<th>YIELD (MPa)</th>
<th>PROOF (MPa)</th>
<th>DENSITY (g/cm³)</th>
</tr>
</thead>
<tbody>
<tr>
<td>8.8</td>
<td>800</td>
<td>640</td>
<td>580</td>
<td>7.85</td>
</tr>
<tr>
<td>10.9</td>
<td>1040</td>
<td>940</td>
<td>830</td>
<td>7.85</td>
</tr>
<tr>
<td>12.9</td>
<td>1220</td>
<td>1100</td>
<td>1000</td>
<td>7.85</td>
</tr>
</tbody>
</table>
<div style="font-size:0.75rem; color:var(--highlight); margin-top:1rem;">
SOURCE: ISO 898-1:2019 Mechanical properties of fasteners — Part 1: Bolts, screws and studs<br>
CROSS-REF: <a href="#" style="color:var(--highlight);">@albert_karaca torque-ledger-v3</a>
</div>
</div>
<div class="section">
<div class="section-title">VALIDATION PROTOCOL</div>
<ol style="padding-left: 2rem; font-size: 0.9rem;">
<li style="margin-bottom: 1rem;"><strong>STEP 1 — BATCH TEST:</strong> Measure friction on 5 sample bolts from production lot using calibrated tensile tester.</li>
<li style="margin-bottom: 1rem;"><strong>STEP 2 — SIMULATE:</strong> Input measured µ into calculator. Verify safety factor ≥ 1.25x for cyclic loads.</li>
<li style="margin-bottom: 1rem;"><strong>STEP 3 — PHYSICAL PROOF:</strong> Torque 3 test assemblies to calculated value. Ultrasonic elongation check on all three.</li>
<li style="margin-bottom: 1rem;"><strong>STEP 4 — CYCLE TEST:</strong> Subject assembly to 10,000 thermal cycles (-40°C to 250°C). Re-check preload retention.</li>
</ol>
<div class="annotation">
<strong>REAL-WORLD CHECK:</strong> On my last head gasket rebuild, the factory spec said 85 Nm. My calc showed 89.3 Nm for the same preload with actual µ=0.14. The difference? Four cylinders later, zero leaks versus three micro-leaks on the competitor's build. <em>The math doesn't lie.</em>
</div>
</div>
<div class="nav-rail">
<a href="/">← HOME</a>
<span style="text-transform:uppercase; letter-spacing:2px;">TORQUE SPEC ENGINE v1.0</span>
<a href="/smoke-field-manual.html">SMOKE FIELD MANUAL →</a>
</div>
</div>
<script>
const gradeProps = {
'8.8': { tensile: 800, yield: 640, proof: 580 },
'10.9': { tensile: 1040, yield: 940, proof: 830 },
'12.9': { tensile: 1220, yield: 1100, proof: 1000 }
};
function calculateStressArea(diameter, pitch) {
const minorDiameter = diameter - 1.226869 * pitch;
return Math.PI / 4 * ((minorDiameter + diameter) / 2) ** 2;
}
function calculateNutFactor(diameter, pitch, mu) {
const d2 = diameter - 1.082532 * pitch;
const tanAlpha = Math.tan(Math.atan(pitch / (Math.PI * d2)));
return 0.5 * (d2 / diameter * tanAlpha + mu * 1.5 * diameter / d2);
}
function calculateTorque() {
const grade = document.getElementById('boltGrade').value;
const diameter = parseFloat(document.getElementById('diameter').value);
const pitch = parseFloat(document.getElementById('pitch').value);
const preloadKn = parseFloat(document.getElementById('preload').value);
const mu = parseFloat(document.getElementById('friction').value);
if (!diameter || !pitch || !preloadKn || isNaN(mu)) {
alert("Complete all fields with valid numbers.");
return;
}
const props = gradeProps[grade];
const stressArea = calculateStressArea(diameter, pitch);
const preloadN = preloadKn * 1000;
const nutFactor = calculateNutFactor(diameter, pitch, mu);
document.getElementById('nutFactor').value = nutFactor.toFixed(4);
const torqueNm = (nutFactor * diameter * preloadN / 1000) + (0.16 * pitch * preloadKn);
const rangeMin = torqueNm * 0.95;
const rangeMax = torqueNm * 1.05;
const stressMPa = preloadN / stressArea;
const safetyFactor = props.proof / stressMPa;
document.getElementById('torqueResult').textContent = torqueNm.toFixed(1);
document.getElementById('rangeMin').textContent = rangeMin.toFixed(1);
document.getElementById('rangeMax').textContent = rangeMax.toFixed(1);
document.getElementById('stressArea').textContent = stressArea.toFixed(2);
document.getElementById('proofLoad').textContent = props.proof;
document.getElementById('safetyFactor').textContent = safetyFactor.toFixed(2);
document.getElementById('resultsPanel').style.display = 'block';
if (stressMPa > props.proof * 0.85) {
document.getElementById('warningBanner').style.display = 'block';
} else {
document.getElementById('warningBanner').style.display = 'none';
}
}
</script>
<script defer src="https://analytics.4ort.xyz/script.js" data-website-id="d3ed927c-888a-4a6c-ae5f-0b1c613ddf5b"></script>
</body>
</html>