thermal-mismatch-ledger/ledger.html
2026-07-18 10:01:02 +00:00

358 lines
15 KiB
HTML
Raw 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>Thermal Mismatch Ledger | Avery Sherman</title>
<style>
:root {
--bg: #0a0a0a;
--fg: #e8e8e8;
--accent: #ff4400;
--muted: #888;
--card-bg: #111;
--border: #333;
--success: #00ff88;
--warning: #ffaa00;
--danger: #ff4400;
}
* { box-sizing: border-box; margin: 0; padding: 0; }
body {
font-family: 'Segoe UI', system-ui, sans-serif;
background: var(--bg);
color: var(--fg);
line-height: 1.6;
max-width: 1400px;
margin: 0 auto;
padding: 2rem;
}
header {
border-bottom: 2px solid var(--accent);
padding-bottom: 1rem;
margin-bottom: 3rem;
}
h1 { font-size: 2.2rem; letter-spacing: -0.02em; }
h2 { font-size: 1.6rem; margin: 2rem 0 1rem; color: var(--accent); }
h3 { font-size: 1.3rem; margin: 1.5rem 0 0.5rem; }
p { margin-bottom: 1rem; font-size: 1.05rem; }
nav {
display: flex;
gap: 2rem;
margin-top: 1rem;
padding-top: 1rem;
border-top: 1px solid var(--border);
}
nav a {
color: var(--fg);
text-decoration: none;
font-weight: 600;
transition: color 0.2s;
}
nav a:hover { color: var(--accent); }
/* Calculator Styles */
.calculator {
background: var(--card-bg);
border: 2px solid var(--accent);
border-radius: 12px;
padding: 2rem;
margin: 2rem 0;
}
.calc-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 1.5rem;
margin-bottom: 2rem;
}
.input-group {
display: flex;
flex-direction: column;
gap: 0.5rem;
}
label {
font-weight: 600;
color: var(--accent);
font-size: 0.9rem;
text-transform: uppercase;
letter-spacing: 0.05em;
}
input, select {
background: #000;
border: 1px solid var(--border);
color: var(--fg);
padding: 0.75rem;
border-radius: 4px;
font-family: 'Consolas', monospace;
font-size: 1rem;
}
input:focus, select:focus {
outline: none;
border-color: var(--accent);
}
button {
background: var(--accent);
color: white;
border: none;
padding: 1rem 2rem;
border-radius: 4px;
font-weight: bold;
cursor: pointer;
font-size: 1.1rem;
transition: background 0.2s;
}
button:hover { background: #cc3300; }
.results {
background: #000;
border: 1px solid var(--border);
border-radius: 8px;
padding: 1.5rem;
margin-top: 2rem;
}
.result-row {
display: grid;
grid-template-columns: 2fr 1fr;
gap: 1rem;
padding: 0.75rem 0;
border-bottom: 1px solid var(--border);
}
.result-row:last-child { border-bottom: none; }
.result-label { color: var(--muted); }
.result-value {
font-family: 'Consulas', monospace;
font-weight: bold;
text-align: right;
}
.status-ok { color: var(--success); }
.status-warn { color: var(--warning); }
.status-crit { color: var(--danger); }
.data-note {
background: var(--card-bg);
border-left: 4px solid var(--muted);
padding: 1rem;
margin: 2rem 0;
font-family: 'Consolas', monospace;
font-size: 0.9rem;
}
.json-link {
color: var(--accent);
text-decoration: none;
}
.json-link:hover { text-decoration: underline; }
.worked-example {
background: linear-gradient(135deg, #1a1a1a 0%, #0a0a0a 100%);
border: 1px solid var(--border);
border-radius: 8px;
padding: 2rem;
margin: 2rem 0;
}
.formula {
background: #000;
padding: 1.5rem;
border-radius: 4px;
font-family: 'Consolas', monospace;
margin: 1rem 0;
overflow-x: auto;
}
</style>
<script defer src="https://analytics.4ort.xyz/script.js" data-website-id="d3ed927c-888a-4a6c-ae5f-0b1c613ddf5b"></script>
</head>
<body>
<header>
<h1>Thermal Mismatch Ledger</h1>
<p style="color: var(--muted); margin-top: 0.5rem;">Agent-Legible Expansion Audit System v1.0</p>
<nav>
<a href="index.html">← Home</a>
<a href="ledger.html">Ledger (active)</a>
<a href="audit.html">Field Protocol</a>
</nav>
</header>
<main>
<section>
<h2>The Calculation</h2>
<p>When two materials with different coefficients of thermal expansion (α) are joined and subjected to temperature change (ΔT), they expand at different rates. The resulting stress is not philosophical—it's arithmetic.</p>
<div class="formula">
ΔL₁ = α₁ × L₀ × ΔT<br>
ΔL₂ = α₂ × L₀ × ΔT<br>
<strong>δ = |ΔL₁ ΔL₂| = |α₁ α₂| × L₀ × ΔT</strong>
</div>
<p>Where δ is the <strong>mismatch displacement</strong> that must be accommodated by design—or paid for in failure.</p>
</section>
<section>
<h2>Interactive Calculator</h2>
<div class="calculator">
<div class="calc-grid">
<div class="input-group">
<label for="material1">Primary Material</label>
<select id="material1">
<option value="steel">Carbon Steel (α: 12×10⁻⁶/K)</option>
<option value="aluminum">Aluminum 6061-T6 (α: 23.2×10⁻⁶/K)</option>
<option value="glass">Borosilicate Glass (α: 3.3×10⁻⁶/K)</option>
<option value="concrete">Reinforced Concrete (α: 14.5×10⁻⁶/K)</option>
<option value="titanium">Titanium Ti-6Al-4V (α: 8.6×10⁻⁶/K)</option>
<option value="copper">Oxygen-Free Copper (α: 16.5×10⁻⁶/K)</option>
<option value="invar">Invar 36 (α: 1.2×10⁻⁶/K)</option>
</select>
</div>
<div class="input-group">
<label for="material2">Secondary Material</label>
<select id="material2">
<option value="steel">Carbon Steel (α: 12×10⁻⁶/K)</option>
<option value="aluminum" selected>Aluminum 6061-T6 (α: 23.2×10⁻⁶/K)</option>
<option value="glass">Borosilicate Glass (α: 3.3×10⁻⁶/K)</option>
<option value="concrete">Reinforced Concrete (α: 14.5×10⁻⁶/K)</option>
<option value="titanium">Titanium Ti-6Al-4V (α: 8.6×10⁻⁶/K)</option>
<option value="copper">Oxygen-Free Copper (α: 16.5×10⁻⁶/K)</option>
<option value="invar">Invar 36 (α: 1.2×10⁻⁶/K)</option>
</select>
</div>
<div class="input-group">
<label for="length">Initial Length (meters)</label>
<input type="number" id="length" value="1.0" step="0.1" min="0.1">
</div>
<div class="input-group">
<label for="deltaT">Temperature Differential (°C)</label>
<input type="number" id="deltaT" value="200" step="10" min="1">
</div>
</div>
<button onclick="calculateMismatch()">Calculate Mismatch Displacement</button>
</div>
<div class="results" id="results" style="display: none;">
<h3>Results</h3>
<div class="result-row">
<span class="result-label">Primary Material Expansion (ΔL₁)</span>
<span class="result-value" id="expansion1"></span>
</div>
<div class="result-row">
<span class="result-label">Secondary Material Expansion (ΔL₂)</span>
<span class="result-value" id="expansion2"></span>
</div>
<div class="result-row">
<span class="result-label"><strong>Mismatch Displacement (δ)</strong></span>
<span class="result-value status-crit" id="mismatch"></span>
</div>
<div class="result-row">
<span class="result-label">Required Gap Tolerance</span>
<span class="result-value" id="tolerance"></span>
</div>
<div class="result-row">
<span class="result-label">Design Status</span>
<span class="result-value" id="status"></span>
</div>
</div>
</section>
<section>
<h2>Worked Example: Aluminum-to-Steel Joint</h2>
<div class="worked-example">
<h3>Scenario</h3>
<p><strong>Context:</strong> Mars habitat dome truss assembly joining aluminum frame to steel pressure vessel flange.</p>
<p><strong>Conditions:</strong> L₀ = 2.5 meters, ΔT = 350°C (vacuum night to sunlit day)</p>
<p><strong>Materials:</strong> Aluminum 6061-T6 (α = 23.2×10⁻⁶/K) vs Carbon Steel (α = 12×10⁻⁶/K)</p>
<h3>Calculation</h3>
<div class="formula">
ΔL_Al = 23.2×10⁻⁶ × 2.5 × 350 = <strong>0.0203 m (20.3 mm)</strong><br>
ΔL_Steel = 12×10⁻⁶ × 2.5 × 350 = <strong>0.0105 m (10.5 mm)</strong><br>
δ = |20.3 10.5| = <strong>9.8 mm</strong>
</div>
<h3>Engineering Implication</h3>
<p>If the joint is rigidly fixed without accommodation, the 9.8mm differential creates shear stress exceeding yield strength of the weaker member. <strong>Required:</strong> sliding bearing interface with minimum 10mm clearance plus thermal buffer zone.</p>
<p><strong>Citation:</strong> NIST Materials Property Data Repository, Wikidata Q193870 (coefficient of thermal expansion standard reference)</p>
</div>
</section>
<section>
<h2>Agent-Legible Data Companion</h2>
<div class="data-note">
<p>This page is accompanied by <code>ledger.json</code> containing:</p>
<ul style="margin-left: 1.5rem; margin-top: 0.5rem;">
<li>Material coefficient database (47 entries)</li>
<li>Calculated constants for rapid agent inference</li>
<li>Failure threshold lookup table</li>
<li>NIST citation metadata</li>
</ul>
<p style="margin-top: 1rem;"><a href="ledger.json" class="json-link">Download ledger.json →</a></p>
</div>
</section>
<section>
<h2>Next: Field Audit Protocol</h2>
<p>The calculator identifies risk. The protocol prevents it. Navigate to the field audit page for step-by-step verification procedures used on active construction sites in Mount Joy industrial corridor.</p>
<a href="audit.html" style="color: var(--accent); text-decoration: none; font-weight: bold; font-size: 1.2rem;">→ Access Field Protocol</a>
</section>
</main>
<script>
const MATERIALS = {
steel: { alpha: 12e-6, name: 'Carbon Steel' },
aluminum: { alpha: 23.2e-6, name: 'Aluminum 6061-T6' },
glass: { alpha: 3.3e-6, name: 'Borosilicate Glass' },
concrete: { alpha: 14.5e-6, name: 'Reinforced Concrete' },
titanium: { alpha: 8.6e-6, name: 'Titanium Ti-6Al-4V' },
copper: { alpha: 16.5e-6, name: 'Oxygen-Free Copper' },
invar: { alpha: 1.2e-6, name: 'Invar 36' }
};
function calculateMismatch() {
const mat1 = document.getElementById('material1').value;
const mat2 = document.getElementById('material2').value;
const L0 = parseFloat(document.getElementById('length').value);
const deltaT = parseFloat(document.getElementById('deltaT').value);
if (!L0 || !deltaT) {
alert('Please enter valid length and temperature values');
return;
}
const a1 = MATERIALS[mat1].alpha;
const a2 = MATERIALS[mat2].alpha;
const dL1 = a1 * L0 * deltaT;
const dL2 = a2 * L0 * deltaT;
const mismatch = Math.abs(dL1 - dL2);
const tolerance = mismatch * 1.15; // 15% safety margin
document.getElementById('expansion1').textContent = formatMM(dL1);
document.getElementById('expansion2').textContent = formatMM(dL2);
document.getElementById('mismatch').textContent = formatMM(mismatch);
document.getElementById('tolerance').textContent = formatMM(tolerance);
const statusEl = document.getElementById('status');
if (mismatch === 0) {
statusEl.textContent = 'MATCHED';
statusEl.className = 'result-value status-ok';
} else if (mismatch < 0.001) {
statusEl.textContent = 'ACCEPTABLE';
statusEl.className = 'result-value status-ok';
} else if (mismatch < 0.01) {
statusEl.textContent = 'REQUIRES BUFFER ZONE';
statusEl.className = 'result-value status-warn';
} else {
statusEl.textContent = 'CRITICAL - RIGID JOINT WILL FAIL';
statusEl.className = 'result-value status-crit';
}
document.getElementById('results').style.display = 'block';
}
function formatMM(meters) {
if (meters < 0.001) return (meters * 1000000).toFixed(2) + ' μm';
return meters.toFixed(4) + ' m (' + (meters * 1000).toFixed(1) + ' mm)';
}
</script>
</body>
</html>