358 lines
15 KiB
HTML
358 lines
15 KiB
HTML
<!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>
|