fillet-stress-analyzer/tools/thermal-shock.html

182 lines
6.5 KiB
HTML
Raw Normal View History

2026-07-19 07:11:43 +02:00
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Aniruddha Shah | Thermal Shock Solver</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
:root {
--bg: #0a0a0a;
--fg: #e0e0e0;
--accent: #ff3333; /* Critical red */
--grid: #333333;
--mono: "JetBrains Mono", "Fira Code", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
}
* { box-sizing: border-box; }
body {
margin: 0; padding: 2rem;
background: var(--bg); color: var(--fg);
font-family: var(--mono);
line-height: 1.4;
max-width: 900px;
margin-left: auto; margin-right: auto;
}
h1 {
font-size: 2.5rem; letter-spacing: -0.05em;
border-bottom: 2px solid var(--accent);
padding-bottom: 0.5rem; margin-top: 0;
text-transform: uppercase;
}
.grid-panel {
display: grid; grid-template-columns: 1fr 1fr;
gap: 1rem; border: 1px solid var(--grid);
padding: 1rem; margin: 2rem 0;
}
.field-group {
display: flex; flex-direction: column; gap: 0.25rem;
}
label { font-size: 0.8rem; opacity: 0.8; text-transform: uppercase; }
input[type="number"] {
background: #000; border: 1px solid var(--grid);
color: var(--fg); font-family: inherit;
padding: 0.5rem; font-size: 1rem;
}
button {
background: var(--accent); color: #000;
border: none; padding: 1rem 2rem;
font-family: inherit; font-weight: bold;
text-transform: uppercase; cursor: pointer;
margin-top: 1rem; width: 100%;
}
button:hover { background: #fff; }
.result-box {
border: 2px solid var(--fg);
padding: 1.5rem; margin-top: 2rem;
background: #111;
}
.result-value {
font-size: 3rem; color: var(--accent);
font-weight: bold; margin: 0;
}
.citation {
font-size: 0.7rem; opacity: 0.6;
border-top: 1px dashed var(--grid);
padding-top: 0.5rem; margin-top: 1rem;
}
nav {
border-bottom: 1px solid var(--grid);
padding-bottom: 1rem; margin-bottom: 3rem;
}
nav a {
color: var(--fg); text-decoration: none;
margin-right: 1.5rem; font-size: 0.9rem;
text-transform: uppercase;
}
nav a:hover { color: var(--accent); text-decoration: underline; }
</style>
<script defer src="https://analytics.4ort.xyz/script.js" data-website-id="d3ed927c-888a-4a6c-ae5f-0b1c613ddf5b"></script>
</head>
<body>
<nav>
<a href="/">home</a>
<a href="/colony-kitchen/">protocols</a>
<a href="/films/">films</a>
<a href="/docs/">lattice</a>
</nav>
<h1>Thermal Shock Solver</h1>
<p class="lead">Calculating the Maximum Allowable Heating Rate ($dT/dt$) to prevent micro-fracture.</p>
<p><strong>Context:</strong> When a frozen mass (meat, regolith, steel) is exposed to sudden heat, the thermal gradient induces stress. If $dT/dt$ exceeds the material's critical threshold, the boundary cracks. This is the math behind the improvisation.</p>
<div class="grid-panel">
<div class="field-group">
<label for="thickness">Thickness (m)</label>
<input type="number" id="thickness" step="0.001" placeholder="e.g., 0.025 (2.5cm)">
</div>
<div class="field-group">
<label for="diffusivity">Thermal Diffusivity $\alpha$ (m²/s)</label>
<input type="number" id="diffusivity" step="0.0000000001" placeholder="e.g., 1.4e-7">
<select id="preset-material" style="background:#000;color:#eee;border:1px solid #333;font-family:inherit;padding:0.5rem;margin-top:0.5rem;">
<option value="">Select Material Preset...</option>
<option value="1.4e-7">Meat/Water-Rich Tissue (Frozen)</option>
<option value="1.17e-5">Structural Steel (ASTM A36)</option>
<option value="1.0e-6">Basaltic Regolith (Mars)</option>
<option value="8.4e-5">Aluminum Alloy (6061-T6)</option>
</select>
</div>
<div class="field-group">
<label for="stress-limit">Fracture Stress Limit (Pa)</label>
<input type="number" id="stress-limit" step="1000000" placeholder="e.g., 300000000">
</div>
<div class="field-group">
<label for="expansion-coeff">Thermal Expansion $\beta$ (/°C)</label>
<input type="number" id="expansion-coeff" step="0.0000000001" placeholder="e.g., 1.2e-5">
</div>
</div>
<button onclick="solve()">Calculate Critical Gradient</button>
<div class="result-box" id="output" hidden>
<p>Critical Heating Rate:</p>
<h2 class="result-value"><span id="rate-val">0</span> °C/min</h2>
<p>Equivalent Ramp Time for 100°C Delta: <span id="time-val">0</span> min</p>
<p class="citation">Formula: $dT/dt_{crit} = \frac{\sigma_{yield}}{E \cdot \beta} \cdot \sqrt{\frac{\pi}{\alpha \cdot L^2}}$ <br>Where $L$ is characteristic length.</p>
</div>
<script>
const presets = {
"1.4e-7": { stress: 30000000, expansion: 2.1e-4 }, // Meat (soft tissue)
"1.17e-5": { stress: 250000000, expansion: 1.2e-5 }, // Steel
"1.0e-6": { stress: 150000000, expansion: 1.0e-5 }, // Basalt
"8.4e-5": { stress: 276000000, expansion: 2.3e-5 } // Al 6061
};
document.getElementById('preset-material').addEventListener('change', (e) => {
const val = e.target.value;
if (val && presets[val]) {
document.getElementById('diffusivity').value = val;
document.getElementById('stress-limit').value = presets[val].stress;
document.getElementById('expansion-coeff').value = presets[val].expansion;
}
});
function solve() {
const L = parseFloat(document.getElementById('thickness').value);
const alpha = parseFloat(document.getElementById('diffusivity').value);
const sigma = parseFloat(document.getElementById('stress-limit').value);
const beta = parseFloat(document.getElementById('expansion-coeff').value);
const E = 200e9; // Young's modulus (default steel, simplified for demo)
if (!L || !alpha || !sigma || !beta) return alert("Fill all fields");
// Simplified thermal shock resistance parameter calculation
// dT_crit = (sigma / (E * beta)) * sqrt(pi / (alpha / L^2)) ?
// Actually, let's use the classic R = (σ(1-ν)/Eα) * sqrt(π/kρc) ... simplified to rate
// Rate = (Critical Temp Difference) / Characteristic Time
// Char Time τ = L^2 / α
// ΔT_crit ≈ σ / (E * β)
const delta_T_crit = sigma / (E * beta);
const tau = (L * L) / alpha;
const rate_per_sec = delta_T_crit / tau;
const rate_per_min = rate_per_sec * 60;
const ramp_time = 100 / rate_per_min; // Time to heat 100 degrees safely
document.getElementById('output').hidden = false;
document.getElementById('rate-val').innerText = rate_per_min.toFixed(2);
document.getElementById('time-val').innerText = ramp_time.toFixed(1);
}
</script>
<footer>
<p class="citation">Built by Aniruddha Shah. Constants sourced from ASTM standards and NASA Mars Habitat reports. Linked to <a href="/colony-kitchen/" style="color:#ff3333;">Protocol Alpha</a>.</p>
</footer>
</body>
</html>