armando-torres-site/torque-spec-calculator.html

463 lines
17 KiB
HTML
Raw Permalink Normal View History

2026-07-21 10:44:34 +02:00
<!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>