Skip to content

Instantly share code, notes, and snippets.

@wd15
Last active February 17, 2026 02:48
Show Gist options
  • Select an option

  • Save wd15/a7d4deef3fbe8feb94627d2130f642f6 to your computer and use it in GitHub Desktop.

Select an option

Save wd15/a7d4deef3fbe8feb94627d2130f642f6 to your computer and use it in GitHub Desktop.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>AM Digital Twin Architecture v5</title>
<style>
body {
margin: 0;
padding: 20px;
font-family: 'Inter', 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
background-color: #ffffff;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
}
.diagram-container {
width: 100%;
max-width: 1600px;
aspect-ratio: 16 / 9;
box-shadow: 0 4px 12px rgba(0,0,0,0.1);
border: 1px solid #e0e0e0;
background-color: #ffffff;
}
svg {
width: 100%;
height: 100%;
}
/* SVG Text Styling */
.title { font-size: 14px; fill: #666; font-weight: bold; letter-spacing: 1px; }
.node-main { font-size: 15px; font-weight: bold; fill: #111; }
.node-sub { font-size: 13px; font-style: italic; fill: #444; }
.edge-label {
font-size: 13px;
fill: #333;
paint-order: stroke;
stroke: #ffffff;
stroke-width: 4px;
stroke-linecap: round;
stroke-linejoin: round;
}
.ai-edge-label {
font-size: 13px;
fill: #7b1fa2;
font-weight: bold;
paint-order: stroke;
stroke: #ffffff;
stroke-width: 4px;
}
</style>
</head>
<body>
<div class="diagram-container">
<svg viewBox="0 0 1600 900" xmlns="http://www.w3.org/2000/svg">
<defs>
<marker id="arrow-solid" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="6" markerHeight="6" orient="auto">
<path d="M 0 0 L 10 5 L 0 10 z" fill="#444" />
</marker>
<marker id="arrow-dashed" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="6" markerHeight="6" orient="auto">
<path d="M 0 0 L 10 5 L 0 10 z" fill="#888" />
</marker>
<marker id="arrow-ai-end" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="6" markerHeight="6" orient="auto">
<path d="M 0 0 L 10 5 L 0 10 z" fill="#7b1fa2" />
</marker>
<marker id="arrow-ai-start" viewBox="0 0 10 10" refX="1" refY="5" markerWidth="6" markerHeight="6" orient="auto">
<path d="M 10 0 L 0 5 L 10 10 z" fill="#7b1fa2" />
</marker>
</defs>
<rect x="990" y="40" width="600" height="260" fill="#faf8fc" stroke="#ce93d8" stroke-width="2" stroke-dasharray="8,6" rx="10" />
<text x="1290" y="70" text-anchor="middle" class="title">AI ORCHESTRATION</text>
<rect x="40" y="380" width="890" height="480" fill="#f0f8ff" stroke="#64b5f6" stroke-width="2" stroke-dasharray="8,6" rx="10" />
<text x="485" y="410" text-anchor="middle" class="title">DIGITAL TWIN</text>
<rect x="990" y="480" width="600" height="260" fill="#fffaf0" stroke="#ffab91" stroke-width="2" stroke-dasharray="8,6" rx="10" />
<text x="1290" y="510" text-anchor="middle" class="title">CONTROL</text>
<path d="M 1105 170 L 1230 170" fill="none" stroke="#444" stroke-width="2" marker-end="url(#arrow-solid)" />
<text x="1167" y="160" text-anchor="middle" class="edge-label">Prompts & Commands</text>
<path d="M 1260 215 C 1260 250, 460 250, 460 660" fill="none" stroke="#7b1fa2" stroke-width="2" stroke-dasharray="6,4" marker-start="url(#arrow-ai-start)" marker-end="url(#arrow-ai-end)" />
<path d="M 1280 215 C 1280 340, 840 340, 840 520" fill="none" stroke="#7b1fa2" stroke-width="2" stroke-dasharray="6,4" marker-start="url(#arrow-ai-start)" marker-end="url(#arrow-ai-end)" />
<text x="860" y="325" text-anchor="middle" class="ai-edge-label">Tool Use / State Query</text>
<path d="M 1360 215 C 1360 350, 1100 350, 1100 560" fill="none" stroke="#7b1fa2" stroke-width="2" stroke-dasharray="6,4" marker-start="url(#arrow-ai-start)" marker-end="url(#arrow-ai-end)" />
<path d="M 1380 215 C 1380 350, 1320 350, 1320 560" fill="none" stroke="#7b1fa2" stroke-width="2" stroke-dasharray="6,4" marker-start="url(#arrow-ai-start)" marker-end="url(#arrow-ai-end)" />
<text x="1210" y="335" text-anchor="middle" class="ai-edge-label">Control Policies / Override</text>
<path d="M 280 470 L 480 540" fill="none" stroke="#888" stroke-width="2" stroke-dasharray="4,4" marker-end="url(#arrow-dashed)" />
<text x="360" y="495" text-anchor="middle" class="edge-label">Model Reduction</text>
<path d="M 240 730 L 435 730" fill="none" stroke="#888" stroke-width="2" marker-end="url(#arrow-dashed)" />
<text x="330" y="722" text-anchor="middle" class="edge-label">Priors</text>
<path d="M 520 655 L 530 620" fill="none" stroke="#444" stroke-width="2" marker-end="url(#arrow-solid)" />
<text x="480" y="640" text-anchor="middle" class="edge-label">State</text>
<path d="M 570 620 L 560 655" fill="none" stroke="#888" stroke-width="2" stroke-dasharray="4,4" marker-end="url(#arrow-dashed)" />
<text x="605" y="640" text-anchor="middle" class="edge-label">Forecast</text>
<path d="M 700 570 L 770 570" fill="none" stroke="#888" stroke-width="2" stroke-dasharray="4,4" marker-end="url(#arrow-dashed)" />
<text x="735" y="562" text-anchor="middle" class="edge-label">Training</text>
<path d="M 600 710 Q 820 710 820 615" fill="none" stroke="#444" stroke-width="2" marker-end="url(#arrow-solid)" />
<text x="750" y="680" text-anchor="middle" class="edge-label">State Nudge</text>
<path d="M 860 615 Q 860 760 610 760" fill="none" stroke="#888" stroke-width="2" stroke-dasharray="4,4" marker-end="url(#arrow-dashed)" />
<text x="825" y="735" text-anchor="middle" class="edge-label">Fast Forecast</text>
<path d="M 900 570 C 950 570, 950 610, 1020 610" fill="none" stroke="#444" stroke-width="3" marker-end="url(#arrow-solid)" />
<text x="965" y="585" text-anchor="middle" class="edge-label" font-weight="bold">Fast Pred</text>
<path d="M 1160 610 L 1250 610" fill="none" stroke="#444" stroke-width="2" marker-end="url(#arrow-solid)" />
<text x="1205" y="602" text-anchor="middle" class="edge-label">Params</text>
<path d="M 1390 610 L 1460 610" fill="none" stroke="#444" stroke-width="2" marker-end="url(#arrow-solid)" />
<text x="1425" y="602" text-anchor="middle" class="edge-label">Actuation</text>
<path d="M 1520 650 L 1520 840 L 520 840 L 520 830" fill="none" stroke="#444" stroke-width="3" marker-end="url(#arrow-solid)" />
<text x="1100" y="830" text-anchor="middle" class="edge-label" font-weight="bold">Observations (y)</text>
<circle cx="1060" cy="170" r="45" fill="#e1bee7" stroke="#8e24aa" stroke-width="2" />
<text x="1060" y="175" text-anchor="middle" class="node-main">USER</text>
<rect x="1240" y="125" width="220" height="90" rx="8" fill="#f3e5f5" stroke="#8e24aa" stroke-width="2" />
<text x="1350" y="160" text-anchor="middle" class="node-main">AI AGENT / MCP</text>
<text x="1350" y="185" text-anchor="middle" class="node-sub">Orchestrator</text>
<rect x="60" y="430" width="220" height="80" rx="5" fill="#e0e0e0" stroke="#9e9e9e" stroke-width="2" stroke-dasharray="5,5" />
<text x="170" y="465" text-anchor="middle" class="node-main">HIGH-FIDELITY MODELS</text>
<text x="170" y="485" text-anchor="middle" class="node-sub">ANSYS / AdditiveFOAM</text>
<path d="M 80,705 C 80,690 240,690 240,705 L 240,755 C 240,770 80,770 80,755 Z" fill="#e0e0e0" stroke="#9e9e9e" stroke-width="2" stroke-dasharray="5,5" />
<ellipse cx="160" cy="705" rx="80" ry="10" fill="#f5f5f5" stroke="#9e9e9e" stroke-width="2" stroke-dasharray="5,5" />
<text x="160" y="735" text-anchor="middle" class="node-main">AM-BENCH DB</text>
<text x="160" y="755" text-anchor="middle" class="node-sub">Validation</text>
<circle cx="520" cy="745" r="85" fill="#c8e6c9" stroke="#388e3c" stroke-width="3" />
<text x="520" y="735" text-anchor="middle" class="node-main">DATA ASSIMILATION</text>
<text x="520" y="760" text-anchor="middle" class="node-sub">TorchDA / EnKF</text>
<rect x="480" y="520" width="220" height="100" rx="5" fill="#bbdefb" stroke="#1976d2" stroke-width="2" />
<text x="590" y="565" text-anchor="middle" class="node-main">ENSEMBLE MODELS</text>
<text x="590" y="590" text-anchor="middle" class="node-sub">Adamantine / ExaCA</text>
<rect x="780" y="530" width="120" height="80" rx="5" fill="#bbdefb" stroke="#1976d2" stroke-width="2" />
<text x="840" y="565" text-anchor="middle" class="node-main">SURROGATE</text>
<text x="840" y="585" text-anchor="middle" class="node-sub">FNOs</text>
<path d="M 1040,570 L 1160,570 L 1180,590 L 1180,630 L 1160,650 L 1040,650 L 1020,630 L 1020,590 Z" fill="#fff9c4" stroke="#fbc02d" stroke-width="2" />
<text x="1100" y="615" text-anchor="middle" class="node-main">OPTIMIZER</text>
<rect x="1250" y="570" width="140" height="80" rx="5" fill="#fff9c4" stroke="#fbc02d" stroke-width="2" />
<text x="1320" y="615" text-anchor="middle" class="node-main">CONTROLLER</text>
<rect x="1460" y="570" width="120" height="80" rx="5" fill="#ffccbc" stroke="#e64a19" stroke-width="3" />
<text x="1520" y="605" text-anchor="middle" class="node-main">AM MACHINE</text>
<text x="1520" y="625" text-anchor="middle" class="node-sub">Melt Pool Sensors</text>
</svg>
</div>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment