:host{all:initial;display:block; --bg:#1c1c1c; --paper:#242424; --ink:#f2f2f2; --ink-2:#c9c9c9; --muted:#9b9b9b; --line:#333333; --line-2:#474747; --panel:#121212; --arc:#ff6600; --arc-dk:#ff9900; --blue:#6aa5ff; --ok:#4fc88a; --warn:#e7b04a; --bad:#ff7a70; --grid:rgba(255,255,255,.03); --radius:6px; --mono:'IBM Plex Mono',ui-monospace,SFMono-Regular,Menlo,Consolas,monospace; --sans:'IBM Plex Sans',system-ui,-apple-system,'Segoe UI',Roboto,sans-serif; --display:'Archivo Black','IBM Plex Sans',Impact,sans-serif; } *{box-sizing:border-box} .mw{margin:0;background:var(--bg);color:var(--ink);font:16px/1.6 var(--sans); background-image:linear-gradient(var(--grid) 1px,transparent 1px),linear-gradient(90deg,var(--grid) 1px,transparent 1px); background-size:28px 28px;-webkit-font-smoothing:antialiased} a{color:inherit} .wrap{max-width:1200px;margin:0 auto;padding:0 24px} .mono{font-family:var(--mono)} .eyebrow{font:600 12px/1 var(--mono);letter-spacing:.14em;text-transform:uppercase;color:var(--arc-dk)} [data-theme="dark"] .eyebrow{color:var(--arc)} h1,h2,h3{line-height:1.15;margin:0} h2{font:400 clamp(28px,3.4vw,40px)/1.1 var(--display);letter-spacing:-.01em} .sec{scroll-margin-top:90px;padding:80px 0;border-top:1px solid var(--line)} .sec-head{display:flex;justify-content:space-between;align-items:end;gap:24px;margin-bottom:32px;flex-wrap:wrap} .sec-head p{max-width:520px;margin:10px 0 0;color:var(--ink-2)} :focus-visible{outline:2px solid var(--arc);outline-offset:2px} /* ---------- header ---------- */ header.top{position:sticky;top:0;z-index:50;background:color-mix(in srgb,var(--bg) 88%,transparent);backdrop-filter:blur(8px);border-bottom:1px solid var(--line)} .nav{display:flex;align-items:center;gap:28px;height:64px} .logo{display:flex;align-items:center;gap:10px;text-decoration:none;font:400 19px/1 var(--display);letter-spacing:-.01em} .logo-mark{width:30px;height:30px;border-radius:4px;background:var(--ink);display:grid;place-items:center;position:relative;overflow:hidden} .logo-mark::after{content:"";width:10px;height:10px;border-radius:50%;background:var(--arc);box-shadow:0 0 12px 4px rgba(255,106,19,.7)} .logo span b{color:var(--arc)} .nav ul{display:flex;gap:4px;list-style:none;margin:0;padding:0} .nav ul a{display:block;padding:8px 12px;border-radius:var(--radius);text-decoration:none;font-weight:500;font-size:15px;color:var(--ink-2)} .nav ul a:hover{background:var(--paper);color:var(--ink)} .nav-right{margin-left:auto;display:flex;gap:8px;align-items:center} .icon-btn{border:1px solid var(--line-2);background:var(--paper);color:var(--ink);height:38px;min-width:38px;padding:0 10px;border-radius:var(--radius);cursor:pointer;font:500 14px var(--sans);display:inline-flex;align-items:center;gap:8px} .icon-btn:hover{border-color:var(--ink)} .kbd{font:600 11px var(--mono);border:1px solid var(--line-2);border-radius:4px;padding:1px 5px;color:var(--muted)} .menu-btn{display:none} @media (max-width:900px){ .nav ul{display:none;position:absolute;top:64px;left:0;right:0;flex-direction:column;background:var(--paper);border-bottom:1px solid var(--line);padding:12px 24px} .nav ul.open{display:flex} .menu-btn{display:inline-flex} .search-label{display:none} .searchbox .hint{display:none} .searchbox input{padding-right:16px} } /* ---------- hero ---------- */ .hero{padding:72px 0 56px;position:relative;overflow:hidden} .hero-grid{display:grid;grid-template-columns:1.15fr .85fr;gap:48px;align-items:center} .hero h1{font:400 clamp(40px,6vw,76px)/.98 var(--display);letter-spacing:-.02em;margin:16px 0 20px} .hero h1 em{font-style:normal;color:var(--arc);position:relative} .hero .lede{font-size:19px;color:var(--ink-2);max-width:560px;margin:0 0 28px} .searchbox{position:relative;max-width:580px} .searchbox input{width:100%;height:58px;border:2px solid var(--ink);border-radius:var(--radius);background:var(--paper);color:var(--ink);padding:0 120px 0 50px;font:500 17px var(--sans);box-shadow:5px 5px 0 var(--ink)} .searchbox input::-webkit-search-cancel-button{-webkit-appearance:none;display:none} .searchbox input:focus{outline:none;box-shadow:5px 5px 0 var(--arc)} .searchbox svg{position:absolute;left:17px;top:19px;color:var(--muted)} .searchbox .hint{position:absolute;right:16px;top:19px} .results{position:absolute;left:0;right:0;top:66px;background:var(--paper);border:1px solid var(--line-2);border-radius:var(--radius);box-shadow:0 18px 40px rgba(0,0,0,.18);max-height:360px;overflow:auto;z-index:20;display:none} .results.show{display:block} .results a{display:flex;justify-content:space-between;gap:12px;padding:11px 16px;text-decoration:none;border-bottom:1px solid var(--line)} .results a:last-child{border-bottom:0} .results a:hover,.results a.active{background:var(--bg)} .results .cat{font:500 11px var(--mono);text-transform:uppercase;letter-spacing:.08em;color:var(--muted);white-space:nowrap} .results mark{background:rgba(255,106,19,.25);color:inherit;border-radius:2px} .results .empty{padding:14px 16px;color:var(--muted)} .chips{display:flex;flex-wrap:wrap;gap:8px;margin-top:22px} .chip{border:1px solid var(--line-2);background:var(--paper);border-radius:999px;padding:6px 13px;font:500 13.5px var(--sans);cursor:pointer;color:var(--ink-2);text-decoration:none} .chip:hover{border-color:var(--arc);color:var(--ink)} /* hero spec card */ .spec{background:var(--panel);border:1px solid var(--line);color:#e9edf1;border-radius:10px;padding:26px;position:relative;box-shadow:0 30px 60px -20px rgba(0,0,0,.45)} .spec::before{content:"";position:absolute;inset:0;border-radius:10px;background:radial-gradient(400px 200px at 85% 0%,rgba(255,106,19,.35),transparent 70%);pointer-events:none} .spec-top{display:flex;justify-content:space-between;align-items:center;font:600 11px var(--mono);letter-spacing:.12em;text-transform:uppercase;color:#93a1ae} .spec-top .live{display:flex;align-items:center;gap:7px;color:var(--arc)} .spec-top .live i{width:7px;height:7px;border-radius:50%;background:var(--arc);animation:pulse 1.6s infinite} @keyframes pulse{0%,100%{opacity:1}50%{opacity:.25}} .bead{height:74px;margin:22px 0 18px;position:relative} .bead svg{width:100%;height:100%} .spec dl{display:grid;grid-template-columns:repeat(3,1fr);gap:1px;background:#2a3542;border:1px solid #2a3542;border-radius:6px;overflow:hidden;margin:0} .spec dl div{background:#1b2531;padding:12px} .spec dt{font:500 10.5px var(--mono);letter-spacing:.1em;text-transform:uppercase;color:#8492a0} .spec dd{margin:4px 0 0;font:600 20px var(--mono);color:#fff} .spec dd small{font-size:12px;color:#93a1ae;font-weight:400} .spec .foot{margin-top:14px;font:12.5px var(--mono);color:#93a1ae} .spec .foot b{color:var(--arc)} @media (max-width:900px){.hero-grid{grid-template-columns:1fr}} /* stats strip */ .strip{display:grid;grid-template-columns:repeat(4,1fr);border:1px solid var(--line-2);border-radius:var(--radius);background:var(--paper);margin-top:56px} .strip>div{padding:18px 22px;border-right:1px solid var(--line)} .strip>div:last-child{border:0} .strip b{display:block;font:400 26px var(--display)} .strip span{font-size:14px;color:var(--muted)} @media (max-width:700px){.strip{grid-template-columns:1fr 1fr}.strip div:nth-child(2){border-right:0}.strip div:nth-child(-n+2){border-bottom:1px solid var(--line)}} /* ---------- toolbox ---------- */ .tool-shell{display:grid;grid-template-columns:250px 1fr;border:1px solid var(--line-2);border-radius:10px;background:var(--paper);overflow:hidden;min-height:520px} .tabs{border-right:1px solid var(--line);padding:12px;display:flex;flex-direction:column;gap:4px;background:var(--bg)} .tab{all:unset;cursor:pointer;padding:12px 14px;border-radius:var(--radius);display:flex;gap:12px;align-items:flex-start} .tab .n{font:600 11px var(--mono);color:var(--muted);padding-top:3px} .tab b{display:block;font-weight:600;font-size:15px} .tab small{color:var(--muted);font-size:13px;line-height:1.35;display:block} .tab:hover{background:var(--paper)} .tab[aria-selected="true"]{background:var(--ink);color:var(--bg)} .tab[aria-selected="true"] small,.tab[aria-selected="true"] .n{color:color-mix(in srgb,var(--bg) 70%,transparent)} .panel{padding:30px 34px;display:none} .panel.active{display:block;animation:fade .25s ease} @keyframes fade{from{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}} .panel h3{font-size:22px;font-weight:700;margin-bottom:4px} .panel .sub{color:var(--muted);margin:0 0 22px;font-size:14.5px} .form{display:grid;grid-template-columns:repeat(auto-fill,minmax(170px,1fr));gap:16px} .field label{display:block;font:600 11.5px var(--mono);letter-spacing:.06em;text-transform:uppercase;color:var(--ink-2);margin-bottom:6px} .field input,.field select{width:100%;height:44px;border:1px solid var(--line-2);border-radius:var(--radius);background:var(--bg);color:var(--ink);padding:0 12px;font:500 16px var(--mono)} .field select{font-size:14px;padding:0 8px} .field input:focus,.field select:focus{outline:none;border-color:var(--arc);box-shadow:0 0 0 3px rgba(255,106,19,.18)} .seg{display:inline-flex;border:1px solid var(--line-2);border-radius:var(--radius);overflow:hidden;margin-bottom:20px} .seg button{all:unset;cursor:pointer;padding:8px 14px;font:600 13px var(--mono)} .seg button.on{background:var(--ink);color:var(--bg)} .out{margin-top:24px;border:1px solid var(--line-2);border-radius:8px;display:grid;grid-template-columns:repeat(auto-fit,minmax(170px,1fr));overflow:hidden} .out>div{padding:16px 18px;border-right:1px solid var(--line)} .out>div:last-child{border-right:0} .out .k{font:600 11px var(--mono);letter-spacing:.08em;text-transform:uppercase;color:var(--muted)} .out .v{font:600 28px/1.2 var(--mono);margin-top:4px} .out .v small{font-size:14px;color:var(--muted);font-weight:400} .out .primary{background:var(--panel);color:#fff} .out .primary .k{color:rgba(255,255,255,.6)} .out .primary .v{color:var(--arc)} .out .primary .v small{color:rgba(255,255,255,.6)} .note{margin-top:16px;font-size:13.5px;color:var(--muted);border-left:3px solid var(--line-2);padding:2px 0 2px 12px} .note code,.formula{font:13px var(--mono);background:var(--bg);border:1px solid var(--line);border-radius:4px;padding:1px 6px} .formula{display:inline-block;margin:0 0 18px;padding:6px 10px;color:var(--ink-2)} .meter{height:14px;border-radius:999px;background:linear-gradient(90deg,#1d7a4c 0%,#1d7a4c 28%,#c9a227 28%,#c9a227 46%,#e0761d 46%,#e0761d 66%,#b3261e 66%);position:relative;margin:30px 0 8px} .meter i{position:absolute;top:-8px;width:4px;height:30px;background:var(--ink);border-radius:2px;transition:left .35s cubic-bezier(.3,1.4,.6,1);box-shadow:0 0 0 2px var(--paper)} .meter-scale{display:flex;justify-content:space-between;font:11px var(--mono);color:var(--muted)} .verdict{margin-top:18px;padding:14px 16px;border-radius:8px;border:1px solid;display:flex;gap:12px;align-items:flex-start} .verdict b{display:block} .verdict.ok{border-color:var(--ok);background:color-mix(in srgb,var(--ok) 8%,transparent)} .verdict.warn{border-color:var(--warn);background:color-mix(in srgb,var(--warn) 9%,transparent)} .verdict.bad{border-color:var(--bad);background:color-mix(in srgb,var(--bad) 8%,transparent)} .dot{width:10px;height:10px;border-radius:50%;margin-top:7px;flex:none} .ok .dot{background:var(--ok)}.warn .dot{background:var(--warn)}.bad .dot{background:var(--bad)} .filler-card{margin-top:22px;border:2px solid var(--ink);border-radius:8px;padding:20px;box-shadow:5px 5px 0 var(--arc)} .filler-card .big{font:600 30px var(--mono);letter-spacing:-.01em} .filler-card .row{display:flex;flex-wrap:wrap;gap:8px;margin-top:10px} .tag{font:600 12px var(--mono);border:1px solid var(--line-2);border-radius:4px;padding:3px 8px;background:var(--bg)} .tag.arc{border-color:var(--arc);color:var(--arc-dk)} [data-theme="dark"] .tag.arc{color:var(--arc)} .filler-card ul{margin:14px 0 0;padding-left:18px;color:var(--ink-2);font-size:14.5px} @media (max-width:860px){.tool-shell{grid-template-columns:1fr}.tabs{flex-direction:row;overflow-x:auto;border-right:0;border-bottom:1px solid var(--line)}.tab{min-width:170px}.panel{padding:22px}} /* ---------- defects ---------- */ .defect-wrap{display:grid;grid-template-columns:300px 1fr;gap:24px} .defect-list{display:flex;flex-direction:column;gap:6px} .defect-btn{all:unset;cursor:pointer;display:flex;justify-content:space-between;align-items:center;padding:12px 16px;border:1px solid var(--line-2);border-radius:var(--radius);background:var(--paper);font-weight:500} .defect-btn:hover{border-color:var(--ink)} .defect-btn.on{background:var(--arc);border-color:var(--arc);color:#fff} .defect-btn .sev{font:600 10.5px var(--mono);letter-spacing:.06em;text-transform:uppercase;opacity:.75} .defect-view{background:var(--paper);border:1px solid var(--line-2);border-radius:10px;padding:28px;display:grid;grid-template-columns:1fr 220px;gap:28px} .defect-view h3{font:400 30px var(--display);margin-bottom:6px} .defect-view .desc{color:var(--ink-2);margin:0 0 20px} .cols{display:grid;grid-template-columns:1fr 1fr;gap:20px} .cols h4{font:600 11.5px var(--mono);letter-spacing:.1em;text-transform:uppercase;margin:0 0 8px;color:var(--muted)} .cols ul{margin:0;padding-left:18px;font-size:15px} .cols li{margin-bottom:5px} .xsec{background:var(--bg);border:1px solid var(--line);border-radius:8px;padding:14px;align-self:start} .xsec svg{width:100%;height:auto;display:block} .xsec p{font:12px var(--mono);color:var(--muted);margin:8px 0 0;text-align:center} .ndt-row{display:flex;flex-wrap:wrap;gap:6px;margin-top:20px;align-items:center;font-size:14px} @media (max-width:900px){.defect-wrap{grid-template-columns:1fr}.defect-list{flex-direction:row;overflow-x:auto}.defect-btn{white-space:nowrap;gap:12px}.defect-view{grid-template-columns:1fr}.cols{grid-template-columns:1fr}} /* ---------- NDT chooser ---------- */ .filters{display:flex;flex-wrap:wrap;gap:22px;margin-bottom:22px;padding:18px 20px;background:var(--paper);border:1px solid var(--line-2);border-radius:10px} .filters fieldset{border:0;padding:0;margin:0} .filters legend{font:600 11px var(--mono);letter-spacing:.08em;text-transform:uppercase;color:var(--muted);margin-bottom:8px} .toggle{display:inline-flex;align-items:center;gap:6px;margin-right:12px;font-size:14.5px;cursor:pointer} .toggle input{accent-color:var(--arc);width:16px;height:16px} .ndt-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:14px} .ndt{background:var(--paper);border:1px solid var(--line-2);border-radius:10px;padding:20px;transition:opacity .25s,transform .25s,border-color .25s;position:relative} .ndt.off{opacity:.32;transform:scale(.985)} .ndt.best{border-color:var(--arc);box-shadow:0 0 0 1px var(--arc)} .ndt .abbr{font:400 34px var(--display);line-height:1} .ndt .name{font-weight:600;margin:4px 0 10px} .ndt p{font-size:14px;color:var(--ink-2);margin:0 0 12px} .bars{display:grid;gap:6px;font:11.5px var(--mono);color:var(--muted)} .bars div{display:grid;grid-template-columns:96px 1fr;align-items:center;gap:8px} .bars span{height:6px;border-radius:3px;background:var(--line);position:relative;overflow:hidden} .bars span::after{content:"";position:absolute;inset:0;width:var(--w);background:var(--ink)} .badge{position:absolute;top:16px;right:16px;font:600 10.5px var(--mono);letter-spacing:.08em;text-transform:uppercase;background:var(--arc);color:#fff;padding:3px 8px;border-radius:4px;display:none} .ndt.best .badge{display:block} .reason{font:12px var(--mono);color:var(--bad);margin-top:10px;display:none} .ndt.off .reason{display:block} /* ---------- quiz ---------- */ .quiz-grid{display:grid;grid-template-columns:1fr 360px;gap:24px} .quiz{background:var(--panel);border:1px solid var(--line);color:#e9edf1;border-radius:10px;padding:30px} .quiz .qmeta{display:flex;justify-content:space-between;font:600 12px var(--mono);letter-spacing:.08em;color:#93a1ae;text-transform:uppercase} .qbar{height:4px;background:#2a3542;border-radius:2px;margin:12px 0 22px;overflow:hidden} .qbar i{display:block;height:100%;background:var(--arc);transition:width .3s} .quiz h3{font-size:22px;font-weight:600;line-height:1.35;margin-bottom:20px} .opts{display:grid;gap:10px} .opt{all:unset;cursor:pointer;border:1px solid #33404d;border-radius:8px;padding:13px 16px;display:flex;gap:12px;align-items:center;font-size:15.5px} .opt:hover:not([disabled]){border-color:#93a1ae;background:#1b2531} .opt .l{font:600 12px var(--mono);border:1px solid #4a5867;border-radius:4px;width:24px;height:24px;display:grid;place-items:center;flex:none} .opt.right{border-color:#4fc88a;background:rgba(79,200,138,.12)} .opt.wrong{border-color:#ff7a70;background:rgba(255,122,112,.12)} .opt[disabled]{cursor:default} .explain{margin-top:16px;font-size:14.5px;color:#c4ced8;border-left:3px solid var(--arc);padding-left:12px;display:none} .explain.show{display:block} .qnav{display:flex;justify-content:flex-end;margin-top:20px} .btn{all:unset;cursor:pointer;background:var(--arc);color:#fff;font:600 14.5px var(--sans);padding:11px 20px;border-radius:var(--radius);display:inline-flex;align-items:center;gap:8px} .btn:hover{background:var(--arc-dk)} .btn[hidden]{display:none} .btn.ghost{background:transparent;border:1px solid var(--line-2);color:var(--ink)} .cert{background:var(--paper);border:1px solid var(--line-2);border-radius:10px;padding:20px;margin-bottom:12px} .cert h4{margin:0 0 4px;font-size:17px} .cert .who{font:12px var(--mono);color:var(--muted)} .cert ol{margin:12px 0 0;padding-left:20px;font-size:14.5px;color:var(--ink-2)} @media (max-width:900px){.quiz-grid{grid-template-columns:1fr}} /* ---------- library ---------- */ .lib-filter{display:flex;gap:6px;flex-wrap:wrap} .lib-filter button{all:unset;cursor:pointer;padding:7px 14px;border:1px solid var(--line-2);border-radius:999px;font:500 14px var(--sans);background:var(--paper)} .lib-filter button.on{background:var(--ink);color:var(--bg);border-color:var(--ink)} .lib{display:grid;grid-template-columns:repeat(auto-fill,minmax(270px,1fr));gap:14px} .card{background:var(--paper);border:1px solid var(--line-2);border-radius:10px;padding:22px;text-decoration:none;display:flex;flex-direction:column;gap:10px;transition:transform .2s,box-shadow .2s,border-color .2s} .card:hover{transform:translateY(-3px);border-color:var(--ink);box-shadow:5px 5px 0 var(--ink)} .card .meta{display:flex;justify-content:space-between;font:600 11px var(--mono);letter-spacing:.08em;text-transform:uppercase;color:var(--muted)} .card .meta .c{color:var(--arc-dk)} [data-theme="dark"] .card .meta .c{color:var(--arc)} .card h4{margin:0;font-size:18px;line-height:1.3} .card p{margin:0;color:var(--ink-2);font-size:14.5px} .card .go{margin-top:auto;font:600 13px var(--mono)} /* ---------- newsletter / footer ---------- */ .cta{background:var(--arc);color:#fff;border-radius:12px;padding:40px;display:grid;grid-template-columns:1fr 1fr;gap:32px;align-items:center;position:relative;overflow:hidden} .cta h2{color:#fff} .cta p{margin:10px 0 0;opacity:.92} .cta form{display:flex;gap:8px} .cta input{flex:1;height:50px;border:2px solid #fff;border-radius:var(--radius);background:rgba(255,255,255,.12);color:#fff;padding:0 14px;font:500 16px var(--sans)} .cta input::placeholder{color:rgba(255,255,255,.75)} .cta button{all:unset;cursor:pointer;background:var(--panel);color:#fff;font-weight:600;padding:0 22px;border-radius:var(--radius)} .cta .msg{font:13px var(--mono);margin-top:10px;min-height:18px} @media (max-width:800px){.cta{grid-template-columns:1fr;padding:28px}.cta form{flex-direction:column}.cta button{height:50px;text-align:center}} footer{padding:56px 0 40px;border-top:1px solid var(--line);margin-top:80px} .foot-grid{display:grid;grid-template-columns:1.4fr repeat(4,1fr);gap:28px} footer h5{font:600 11.5px var(--mono);letter-spacing:.1em;text-transform:uppercase;color:var(--muted);margin:0 0 12px} footer ul{list-style:none;margin:0;padding:0;display:grid;gap:7px;font-size:14.5px} footer ul a{text-decoration:none;color:var(--ink-2)} footer ul a:hover{color:var(--arc)} .legal{margin-top:40px;padding-top:20px;border-top:1px solid var(--line);display:flex;justify-content:space-between;flex-wrap:wrap;gap:12px;font-size:13px;color:var(--muted)} @media (max-width:800px){.foot-grid{grid-template-columns:1fr 1fr}} .toast{position:fixed;bottom:20px;left:50%;transform:translateX(-50%) translateY(80px);background:var(--ink);color:var(--bg);padding:10px 16px;border-radius:var(--radius);font:500 14px var(--sans);transition:transform .3s;z-index:99} .toast.show{transform:translateX(-50%) translateY(0)} @media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}} .mw{padding-bottom:60px}
Welding Engineering · Metallurgy · NDT

From theory to the weld bead.

Bridging the gap between theoretical metallurgy and practical application — calculators, selectors and expert-reviewed guides for welders, inspectors, engineers and students.

8Free interactive tools
ASME · AWS · ENCodes referenced
P91 → 6061Materials covered
CWI · CSWIPExam prep
Engineering Toolbox

Calculate it before you strike an arc.

Quick, transparent calculators with the formula shown. Results are indicative — always verify against your WPS and governing code.

Heat Input Calculator

Arc energy and heat input per unit length of weld.

SAW — 1.0 GMAW / MIG — 0.8 FCAW — 0.8 SMAW / Stick — 0.8 GTAW / TIG — 0.6 PAW — 0.6
Arc energy
—
Heat input (EN, × k)
—
ASME IX / AWS
—

Arc energy E = V × A × 60 / (1000 × S). EN 1011-1 heat input Q = k × E. ASME Section IX QW-409.1 and AWS D1.1 use arc energy without the thermal efficiency factor (J/in). For pulsed or waveform-controlled processes, use instantaneous energy or power instead.

Carbon Equivalent & Preheat

Enter the chemical composition (wt %) from the mill test certificate.

CE(IIW) = C + Mn/6 + (Cr+Mo+V)/5 + (Ni+Cu)/15
— Custom — ASTM A36 (typ.) ASTM A516 Gr. 70 (typ.) 1¼Cr-½Mo · P11 (typ.) 2¼Cr-1Mo · P22 (typ.) AISI 4140 (typ.)
CE (IIW)
—
Weldability
—
Indicative preheat
—
0.200.350.450.600.80+
—

Guidance only. Actual preheat depends on hydrogen level, restraint and combined thickness — use AWS D1.1 Annex H, EN 1011-2 or your qualified WPS. Cr-Mo steels such as P91 have code-mandated minimums regardless of CE.

Filler Metal Selector

Pick both base metals. Works for similar and dissimilar joints.

Common AWS classifications shown (A5.1, A5.4, A5.5, A5.9, A5.10, A5.14, A5.18, A5.28). Confirm against service conditions, PWHT requirements and the qualified WPS.

Weld Metal Estimator

Estimate deposited metal and consumable required for equal-leg fillet welds.

Carbon / low-alloy steelStainless steelAluminum
SMAW — 60%GMAW solid — 95%FCAW — 85%SAW — 99%GTAW — 98%
Cross-section
—
Deposited metal
—
Consumable needed
—

Area A = leg² / 2 × (1 + reinforcement). Mass = A × length × density. Consumable = deposited ÷ efficiency (SMAW figure accounts for stub loss, spatter and slag).

Unit Converter

Type in either box — the other updates instantly.

Troubleshooter

Diagnose the defect. Fix the cause.

Select an imperfection to see root causes, corrective actions and the NDT methods best suited to detect it.

Inspection & NDT

Which NDT method fits the job?

Set your conditions. Methods that don't fit fade out, and the best match is highlighted.

Material
Flaw location
Constraints
Certification Prep

Practice like it's exam day.

Quick-fire questions in the style of AWS CWI and CSWIP 3.1 exams, with explanations.

AWS Certified Welding Inspector

American Welding Society · QC-1
  1. Part A — Fundamentals
  2. Part B — Practical (hands-on with replicas)
  3. Part C — Code application (e.g. D1.1, API 1104)

CSWIP 3.1 Welding Inspector

TWI Certification
  1. General theory & technology
  2. Practical plate & pipe inspection
  3. Macro assessment & WPS questions
Browse inspection guides →
Knowledge Library

Expert-reviewed guides.

One technical note a week.

Metallurgy explained, code changes summarised, and a practice question — straight to your inbox. No spam.

(() => { const host = document.getElementById('mw-home'); if (!host || host.shadowRoot) return; const root = host.attachShadow({mode:'open'}); root.appendChild(document.getElementById('mw-home-tpl').content.cloneNode(true)); const $ = (s, r=root) => r.querySelector(s); const $$ = (s, r=root) => [...r.querySelectorAll(s)]; const goTo = id => { const el = root.getElementById(id); if (el) el.scrollIntoView({behavior:'smooth', block:'start'}); }; root.addEventListener('click', e => { const a = e.target.closest('a[href^="#"]'); if (!a) return; e.preventDefault(); const id = a.getAttribute('href').slice(1); if (id) goTo(id); }); const fmt = (n, d=2) => isFinite(n) ? n.toLocaleString(undefined,{minimumFractionDigits:d,maximumFractionDigits:d}) : '—'; const toast = msg => { const t=$('#toast'); t.textContent=msg; t.classList.add('show'); clearTimeout(t._h); t._h=setTimeout(()=>t.classList.remove('show'),2200); }; /* ---------- hero animated bead ---------- */ (function bead(){ const path=$('#beadPath'), g=$('#arcGlow'), c=$('#arcCore'); let x=0, vals=[24,220]; function draw(){ x = (x + 1.3) % 440; const pts=[]; const end=Math.min(x,400); for(let i=0;i1 ? `M0,44 L${pts.join(' L')} L${end},44 Z` : ''); g.setAttribute('cx', end); c.setAttribute('cx', end); const flick = .45 + Math.random()*.3; g.setAttribute('opacity', x>400?0:flick); c.setAttribute('opacity', x>400?0:1); if (Math.random() < .03){ vals=[+(23+Math.random()*3).toFixed(1), Math.round(210+Math.random()*25)]; $('#hv').innerHTML=vals[0]+' V'; $('#ha').innerHTML=vals[1]+' A'; $('#hh').innerHTML=(0.8*vals[0]*vals[1]*60/(1000*250)).toFixed(2)+' kJ/mm'; } requestAnimationFrame(draw); } if (!matchMedia('(prefers-reduced-motion: reduce)').matches) draw(); else path.setAttribute('d','M0,44 L0,34 L400,34 L400,44 Z'); })(); /* ---------- tabs ---------- */ function openTab(id){ $$('.tab').forEach(t => t.setAttribute('aria-selected', t.dataset.tab===id)); $$('.panel').forEach(p => p.classList.toggle('active', p.id==='p-'+id)); } $$('.tab').forEach(t => t.onclick = () => openTab(t.dataset.tab)); $$('[data-tool]').forEach(a => a.addEventListener('click', () => openTab(a.dataset.tool))); /* ---------- heat input ---------- */ let hiUnit='metric'; $$('#hiUnits button').forEach(b => b.onclick = () => { if (b.dataset.u===hiUnit) return; $$('#hiUnits button').forEach(x=>x.classList.toggle('on', x===b)); const s=$('#hiS'); s.value = hiUnit==='metric' ? (s.value/25.4).toFixed(1) : Math.round(s.value*25.4); hiUnit=b.dataset.u; $('#hiSl').textContent = hiUnit==='metric' ? 'Travel speed (mm/min)' : 'Travel speed (in/min)'; calcHI(); }); function calcHI(){ const V=+$('#hiV').value, A=+$('#hiA').value, S=+$('#hiS').value, k=+$('#hiP').value; if(!(V>0&&A>0&&S>0)){ ['#hiArc','#hiQ','#hiJ'].forEach(i=>$(i).textContent='—'); return; } const Smm = hiUnit==='metric' ? S : S*25.4; const E = V*A*60/(1000*Smm); // kJ/mm const Jin = V*A*60/(hiUnit==='metric' ? S/25.4 : S); // J/in $('#hiArc').innerHTML = fmt(E)+' kJ/mm'; $('#hiQ').innerHTML = fmt(E*k)+' kJ/mm'; $('#hiJ').innerHTML = (hiUnit==='metric' ? fmt(Jin/1000,1)+' kJ/in' : fmt(Jin/1000,1)+' kJ/in'); } ['#hiV','#hiA','#hiS','#hiP'].forEach(i => $(i).addEventListener('input', calcHI)); calcHI(); /* ---------- CE ---------- */ $('#cePreset').onchange = e => { if(!e.target.value) return; const v=e.target.value.split(','); $$('#ceForm [data-el]').forEach((inp,i)=>inp.value=v[i]); calcCE(); }; function calcCE(){ const g={}; $$('#ceForm [data-el]').forEach(i => g[i.dataset.el] = +i.value||0); const t=+$('#ceT').value||0; const ce = g.C + g.Mn/6 + (g.Cr+g.Mo+g.V)/5 + (g.Ni+g.Cu)/15; $('#ceVal').textContent = ce.toFixed(3); let rate, pre, cls, vt, vd; if (ce 38 ? '≈ 50 °C' : 'Not usually req.'; cls='ok'; vt='Good weldability.'; vd=' Low hardenability; standard practice is generally sufficient. Remove moisture and observe minimum ambient temperature.'; } else if (ce 25 ? '75–150 °C' : '50–100 °C'; cls='ok'; vt='Moderate hardenability.'; vd=' Use low-hydrogen consumables; light preheat likely for thicker or restrained joints.'; } else if (ce 25 ? '150–250 °C' : '100–200 °C'; cls='warn'; vt='Susceptible to HAZ hydrogen cracking.'; vd=' Preheat, low-hydrogen process (H4–H8), controlled interpass and slow cooling recommended.'; } else { rate='Poor'; pre='200–350 °C'; cls='bad'; vt='High cracking risk.'; vd=' Preheat, hydrogen bake-out / post-heat and PWHT may be required. Qualify the procedure carefully.'; } $('#ceRate').textContent=rate; $('#cePre').textContent=pre; const pos = Math.max(0,Math.min(1,(ce-0.20)/0.65)); $('#ceNeedle').style.left = `calc(${pos*100}% - 2px)`; const v=$('#ceVerdict'); v.className='verdict '+cls; $('#ceVt').textContent=vt; $('#ceVd').textContent=vd; } $$('#ceForm input').forEach(i => i.addEventListener('input', () => { $('#cePreset').value=''; calcCE(); })); calcCE(); /* ---------- Filler selector ---------- */ const MATS = { cs: {n:'Carbon steel (A36, A516-70)', g:'cs'}, hs: {n:'High-strength low-alloy (A572-50)', g:'cs'}, p11: {n:'1¼Cr-½Mo (P11 / F11)', g:'crmo'}, p22: {n:'2¼Cr-1Mo (P22 / F22)', g:'crmo'}, p91: {n:'9Cr-1Mo-V (P91)', g:'crmo'}, ss304:{n:'Stainless 304 / 304L', g:'ss'}, ss316:{n:'Stainless 316 / 316L', g:'ss'}, ss321:{n:'Stainless 321 / 347', g:'ss'}, dup: {n:'Duplex 2205', g:'dup'}, ni: {n:'Nickel alloy 600 / 625', g:'ni'}, al6: {n:'Aluminum 6061 / 6063', g:'al'}, al5: {n:'Aluminum 5083 / 5086', g:'al'} }; const SAME = { cs: {f:'ER70S-6', s:'E7018', x:['E71T-1 (FCAW)','EM12K (SAW)'], notes:['ER70S-6 has extra deoxidisers for mill scale.','E7018 is low-hydrogen — store in a holding oven after opening.']}, hs: {f:'ER70S-6', s:'E7018', x:['E80-series for higher strength'], notes:['Match tensile strength; check toughness requirements.']}, p11: {f:'ER80S-B2', s:'E8018-B2', x:[], notes:['Preheat ~150 °C typical; PWHT often required by code.','Low-hydrogen practice essential.']}, p22: {f:'ER90S-B3', s:'E9018-B3', x:[], notes:['Preheat ~200 °C typical; PWHT normally required.']}, p91: {f:'ER90S-B9', s:'E9015-B9 / E9016-B9', x:['B91 in newer AWS editions'], notes:['Preheat ≥ 200 °C, strict interpass control.','Cool below martensite finish before PWHT (≈ 760 °C).','Keep Ni+Mn low to avoid lowering Ac1.']}, ss304:{f:'ER308L', s:'E308L-16', x:['ER308LSi for MIG wetting'], notes:['L-grade (low carbon) limits sensitisation.','Aim for ~3–10 FN ferrite to avoid hot cracking.']}, ss316:{f:'ER316L', s:'E316L-16', x:['ER316LSi'], notes:['Mo in filler maintains pitting resistance.']}, ss321:{f:'ER347', s:'E347-16', x:[], notes:['Ti does not transfer well across the arc — Nb-stabilised 347 is used for 321.']}, dup: {f:'ER2209', s:'E2209-16', x:[], notes:['Over-alloyed with Ni to balance ferrite/austenite.','Control heat input (~0.5–2.5 kJ/mm) and interpass ≤ 150 °C.']}, ni: {f:'ERNiCr-3 / ERNiCrMo-3', s:'ENiCrFe-3 / ENiCrMo-3', x:[], notes:['ERNiCrMo-3 (625) for corrosion service.','Very sluggish weld pool — manipulate carefully.']}, al6: {f:'ER4043', s:'—', x:['ER5356 (higher strength, anodise match)'], notes:['4043: better crack resistance, more fluid.','5356: higher shear strength; not for > 65 °C sustained service.']}, al5: {f:'ER5183', s:'—', x:['ER5356'], notes:['Do not use 4xxx filler on high-Mg alloys (Mg₂Si brittleness).']} }; function pickFiller(a,b){ if (a===b) return SAME[a]; const ga=MATS[a].g, gb=MATS[b].g, pair=[ga,gb].sort().join('-'); const hasAl = ga==='al'||gb==='al'; if (ga==='al'&&gb==='al') return {f:'ER5356', s:'—', x:['ER4043 if 6xxx crack-sensitivity governs'], notes:['For 5xxx to 6xxx, 5356 is the common choice.']}; if (hasAl) return {f:'Not arc weldable', s:'—', x:['Explosion-bonded transition insert','Friction / CMT-braze techniques'], notes:['Aluminum to steel forms brittle Fe–Al intermetallics under fusion welding.'], warn:true}; const lower = (x,y) => { const order=['cs','hs','p11','p22','p91']; return order.indexOf(x) ~370 °C consider ERNiCr-3.']}; if (pair==='crmo-ss') return {f:'ERNiCr-3', s:'ENiCrFe-3', x:['ER309L for low-temperature service'], notes:['Ni-base filler minimises carbon migration and thermal-expansion mismatch at elevated temperature.']}; if (pair==='ss-ss') return {f: (a==='ss316'||b==='ss316') ? 'ER316L' : 'ER308L', s:(a==='ss316'||b==='ss316')?'E316L-16':'E308L-16', x:['ER347 if stabilised grade required'], notes:['Match the lower-alloyed grade unless corrosion demands otherwise.']}; if (pair==='dup-ss') return {f:'ER2209', s:'E2209-16', x:['ER309LMo'], notes:['2209 maintains strength; 309LMo is a common alternative.']}; if (pair==='cs-dup'||pair==='crmo-dup') return {f:'ER309L', s:'E309L-16', x:['ER2209','ER309LMo'], notes:['Either 309L or 2209 per client spec; check ferrite.']}; if (ga==='ni'||gb==='ni') return {f:'ERNiCrMo-3', s:'ENiCrMo-3', x:['ERNiCr-3'], notes:['Ni-base filler is standard for nickel-alloy dissimilar joints.']}; return {f:'Consult specialist', s:'—', x:[], notes:[]}; } const bm1=$('#bm1'), bm2=$('#bm2'); Object.entries(MATS).forEach(([k,v]) => { bm1.add(new Option(v.n,k)); bm2.add(new Option(v.n,k)); }); bm1.value='cs'; bm2.value='ss304'; function renderFiller(){ const r = pickFiller(bm1.value,bm2.value); $('#fillerOut').innerHTML = `
${MATS[bm1.value].n} ⟷ ${MATS[bm2.value].n}
${r.f}
${r.s && r.s!=='—' ? `SMAW: ${r.s}`:''} ${!r.warn ? `GMAW/GTAW: ${r.f}`:''} ${r.x.map(x=>`${x}`).join('')}
${r.notes.length?`
    ${r.notes.map(n=>`
  • ${n}
  • `).join('')}
`:''}`; } bm1.onchange=bm2.onchange=renderFiller; renderFiller(); /* ---------- deposit ---------- */ function calcDep(){ const L=+$('#dLeg').value, len=+$('#dLen').value, rf=+$('#dRf').value/100, rho=+$('#dMat').value, eff=+$('#dEff').value; const A = L*L/2*(1+rf); // mm² const m = A*len*1000*rho/1e6; // kg (mm² × mm × g/cm³ → /1e6 kg... A*len(mm)*rho/1e6) $('#dA').innerHTML = fmt(A,1)+' mm²'; $('#dM').innerHTML = fmt(m)+' kg'; $('#dC').innerHTML = fmt(m/eff)+' kg'; } ['#dLeg','#dLen','#dRf','#dMat','#dEff'].forEach(i=>$(i).addEventListener('input',calcDep)); calcDep(); /* ---------- converter ---------- */ const CONV = [ {a:'in', b:'mm', f:x=>x*25.4, r:x=>x/25.4, va:0.375}, {a:'ksi', b:'MPa', f:x=>x*6.894757, r:x=>x/6.894757, va:70}, {a:'°F', b:'°C', f:x=>(x-32)*5/9, r:x=>x*9/5+32, va:400}, {a:'ft·lbf', b:'J', f:x=>x*1.355818, r:x=>x/1.355818, va:20}, {a:'kJ/in', b:'kJ/mm', f:x=>x/25.4, r:x=>x*25.4, va:30}, {a:'CFH', b:'L/min', f:x=>x*0.471947, r:x=>x/0.471947, va:35} ]; const cg=$('#convGrid'); CONV.forEach(c => { const row=document.createElement('div'); row.style.cssText='display:grid;grid-template-columns:1fr auto 1fr;gap:12px;align-items:end'; row.innerHTML=`
⇄
`; const [ia,ib]=$$('input',row); const r4=x=>+x.toFixed(4); ia.value=c.va; ib.value=r4(c.f(c.va)); ia.oninput=()=>ib.value = ia.value===''?'':r4(c.f(+ia.value)); ib.oninput=()=>ia.value = ib.value===''?'':r4(c.r(+ib.value)); cg.appendChild(row); }); /* ---------- defects ---------- */ const DEF = [ {id:'por', n:'Porosity', sev:'Volumetric', d:'Gas pores trapped in the solidifying weld metal — scattered, clustered, linear or elongated (wormhole).', c:['Inadequate or excessive shielding gas flow','Drafts / wind disturbing the gas shield','Moisture in flux, coating or on joint','Oil, paint, rust or galvanising on the base metal','Excessive arc length or contaminated tip/nozzle'], f:['Set gas flow correctly (typ. 15–20 L/min for GMAW) and check for leaks','Screen the work area from drafts','Bake / store low-hydrogen consumables properly','Clean joint to bright metal 25 mm either side','Shorten arc; clean nozzle of spatter'], ndt:['RT','UT','VT'], svg:'por'}, {id:'lof', n:'Lack of Fusion', sev:'Planar', d:'Weld metal fails to fuse with the base metal or a previous bead — a planar, often critical flaw.', c:['Heat input too low for thickness','Incorrect torch / electrode angle','Travel speed too fast or too slow (rolling over puddle)','Short-circuit transfer on thick sections','Mill scale or oxide on sidewalls'], f:['Increase current / use spray or pulse transfer','Direct the arc at the sidewall','Adjust travel so the arc stays at the leading edge of the pool','Grind and clean between passes','Widen bevel angle for access'], ndt:['UT','PAUT','RT (limited)'], svg:'lof'}, {id:'ip', n:'Incomplete Penetration', sev:'Planar', d:'Weld metal does not extend through the joint thickness, leaving the root unfused.', c:['Root gap too small or root face too thick','Current too low','Electrode too large for joint','Excessive travel speed'], f:['Follow WPS joint geometry (gap / land)','Increase amperage on root pass','Use a smaller electrode for the root','Back-gouge and weld from the second side'], ndt:['RT','UT','VT (if root accessible)'], svg:'ip'}, {id:'uc', n:'Undercut', sev:'Surface', d:'A groove melted into the base metal at the weld toe, left unfilled by weld metal.', c:['Current or voltage too high','Excessive travel speed','Wrong electrode angle','Too-long arc / excessive weaving'], f:['Reduce current and voltage','Slow travel; pause at the toes when weaving','Correct the work angle (typ. 45° for fillets)','Blend-grind or repair-weld per code limits'], ndt:['VT','PT','MT'], svg:'uc'}, {id:'hc', n:'Hydrogen (Cold) Cracking', sev:'Critical', d:'Delayed cracking in the HAZ or weld metal caused by hydrogen, a hardened microstructure and tensile stress together.', c:['High carbon equivalent / hardenable steel','Moisture-contaminated consumables','No or insufficient preheat','High restraint and thick sections','Rapid cooling'], f:['Preheat and maintain interpass temperature','Use H4/H8 low-hydrogen consumables, baked correctly','Post-heat / hydrogen bake-out after welding','Reduce restraint; consider buttering','Delay final NDT (often 48 h) to catch delayed cracks'], ndt:['MT','UT','PT'], svg:'hc'}, {id:'sc', n:'Solidification (Hot) Cracking', sev:'Critical', d:'Centreline cracks forming during solidification as low-melting films are pulled apart.', c:['High depth-to-width bead ratio','Sulphur / phosphorus contamination','Fully austenitic weld metal (no ferrite)','Concave bead with high restraint','Crater not filled at stop'], f:['Keep bead width ≥ depth; reduce current / speed','Use filler with 3–10 FN ferrite (stainless)','Use 4043 for crack-sensitive Al alloys','Fill craters / use crater-fill function','Reduce restraint and joint gap'], ndt:['VT','PT','UT'], svg:'sc'}, {id:'si', n:'Slag Inclusions', sev:'Volumetric', d:'Non-metallic solid trapped in the weld, typically between passes in SMAW, FCAW or SAW.', c:['Incomplete slag removal between passes','Undercut or notches that trap slag','Low current, cold puddle','Poor bead profile (convex)'], f:['Thoroughly chip and wire-brush between passes','Grind convex beads before next pass','Increase current slightly','Maintain correct electrode angle and travel'], ndt:['RT','UT'], svg:'si'}, {id:'bt', n:'Burn-Through / Excess Penetration', sev:'Surface', d:'Molten metal falls through the root, creating holes or excessive root reinforcement.', c:['Heat input too high','Root gap too large','Travel speed too slow','Thin material without backing'], f:['Reduce current / use pulsed mode','Control fit-up within WPS tolerance','Increase travel speed','Use copper or ceramic backing'], ndt:['VT','RT'], svg:'bt'} ]; const SVG = { base:(inner)=>`${inner}`, por:()=>SVG.base(''), lof:()=>SVG.base(''), ip:()=>SVG.base(''), uc:()=>``, hc:()=>SVG.base(''), sc:()=>SVG.base(''), si:()=>SVG.base(''), bt:()=>`` }; const dl=$('#defectList'); DEF.forEach((d,i)=>{ const b=document.createElement('button'); b.className='defect-btn'+(i?'':' on'); b.innerHTML=`${d.n}${d.sev}`; b.onclick=()=>{ $$('.defect-btn').forEach(x=>x.classList.remove('on')); b.classList.add('on'); showDef(d); }; dl.appendChild(b); }); function showDef(d){ $('#defectView').innerHTML=`
${d.sev} imperfection

${d.n}

${d.d}

Likely causes

    ${d.c.map(x=>`
  • ${x}
  • `).join('')}

Corrective actions

    ${d.f.map(x=>`
  • ${x}
  • `).join('')}
DETECT WITH →${d.ndt.map(x=>`${x}`).join('')}
${SVG[d.svg]()}

Cross-section (schematic)

`; } showDef(DEF[0]); /* ---------- NDT chooser ---------- */ const NDT=[ {a:'VT', n:'Visual Testing', p:'First and most cost-effective method. Finds surface profile defects, undercut, porosity, cracks at surface.', s:{sens:40,cost:95,speed:95}, surf:true, sub:false, mats:['fe','aus','nc'], one:true, rad:false, rec:false}, {a:'PT', n:'Liquid Penetrant', p:'Detects surface-breaking flaws on non-porous materials, including stainless and aluminum.', s:{sens:70,cost:80,speed:60}, surf:true, sub:false, mats:['fe','aus','nc'], one:true, rad:false, rec:false}, {a:'MT', n:'Magnetic Particle', p:'Surface and slightly sub-surface flaws in ferromagnetic materials. Fast and highly sensitive to cracks.', s:{sens:80,cost:80,speed:75}, surf:true, sub:false, mats:['fe'], one:true, rad:false, rec:false, best:'surf-fe'}, {a:'UT', n:'Ultrasonic Testing', p:'Volumetric — excellent for planar flaws (lack of fusion, cracks). Gives depth and through-wall sizing. PAUT/TOFD offer recorded data.', s:{sens:85,cost:60,speed:65}, surf:false, sub:true, mats:['fe','aus'], one:true, rad:false, rec:true, best:'sub'}, {a:'RT', n:'Radiographic Testing', p:'Volumetric — ideal for porosity and slag inclusions. Film or digital image provides a permanent record.', s:{sens:75,cost:40,speed:35}, surf:false, sub:true, mats:['fe','aus','nc'], one:false, rad:true, rec:true}, {a:'ET', n:'Eddy Current', p:'Surface and near-surface flaws in conductive materials; works through thin coatings. ACFM variant for weld toes.', s:{sens:70,cost:65,speed:85}, surf:true, sub:false, mats:['fe','aus'], one:true, rad:false, rec:true} ]; const ng=$('#ndtGrid'); NDT.forEach(m=>{ const el=document.createElement('article'); el.className='ndt'; el.dataset.a=m.a; el.innerHTML=`Best fit
${m.a}
${m.n}

${m.p}

Sensitivity
Cost-effective
Speed
`; ng.appendChild(el); }); function filterNDT(){ const mat=$('input[name=mat]:checked').value, loc=$('input[name=loc]:checked').value; const one=$('#oneSide').checked, noRad=$('#noRad').checked, rec=$('#record').checked; const fits=[]; NDT.forEach(m=>{ const el=ng.querySelector(`[data-a="${m.a}"]`); let why=''; if(!m.mats.includes(mat)) why = mat==='aus' ? '✕ Not for non-ferromagnetic' : '✕ Material not suitable'; else if(loc==='surf' && !m.surf) why='✕ Better for internal flaws'; else if(loc==='sub' && !m.sub) why='✕ Surface only'; else if(one && !m.one) why='✕ Needs access both sides'; else if(noRad && m.rad) why='✕ Ionising radiation'; else if(rec && !m.rec) why='✕ No permanent record'; el.classList.toggle('off',!!why); el.querySelector('.reason').textContent=why; el.classList.remove('best'); if(!why) fits.push(m); }); const pref = loc==='surf' ? (mat==='fe'?['MT','PT','ET','VT']:['PT','ET','VT']) : (rec&&!noRad&&!one?['RT','UT']:['UT','RT']); const top = pref.find(a=>fits.some(f=>f.a===a)); if(top) ng.querySelector(`[data-a="${top}"]`).classList.add('best'); } $$('#ndtFilters input').forEach(i=>i.addEventListener('change',filterNDT)); filterNDT(); /* ---------- quiz ---------- */ const Q=[ {q:'Which NDT method cannot be used on austenitic stainless steel welds?', o:['Liquid penetrant','Magnetic particle','Ultrasonic','Radiography'], a:1, e:'Austenitic stainless is non-ferromagnetic, so it cannot be magnetised for MT. Use PT for surface flaws.'}, {q:'In the SMAW electrode E7018, what does “70” indicate?', o:['70 °C maximum interpass','70% iron powder','70 ksi minimum tensile strength','Electrode length of 70 mm'], a:2, e:'Per AWS A5.1, the first two digits give minimum tensile strength in ksi (70 ksi ≈ 480 MPa).'}, {q:'With 25 V, 200 A and a travel speed of 10 in/min, what is the heat input per ASME IX?', o:['3 kJ/in','30 kJ/in','50 kJ/in','300 kJ/in'], a:1, e:'H = V × A × 60 / S = 25 × 200 × 60 / 10 = 30,000 J/in = 30 kJ/in.'}, {q:'Which filler metal is most commonly used to join 304 stainless to carbon steel?', o:['ER308L','ER70S-6','ER309L','ER4043'], a:2, e:'ER309L is over-alloyed (≈23Cr-12Ni) to absorb dilution from the carbon steel and still give a crack-resistant austenitic-ferritic deposit.'}, {q:'On an AWS A2.4 weld symbol, a fillet weld symbol placed below the reference line means:', o:['Weld on the arrow side','Weld on the other side','Weld all around','Field weld'], a:0, e:'Below the reference line = arrow side; above = other side. The “all-around” and “field weld” are separate supplementary symbols.'}, {q:'Hydrogen-induced cracking is also commonly known as:', o:['Hot cracking','Cold cracking','Lamellar tearing','Reheat cracking'], a:1, e:'It occurs after the weld cools (often hours later), which is why it is called cold or delayed cracking.'}, {q:'Which imperfection is generally considered the most detrimental?', o:['Scattered porosity','Planar lack of fusion','Slight reinforcement excess','Spatter'], a:1, e:'Planar flaws have sharp tips that concentrate stress and can propagate under load or fatigue.'} ]; let qi=0, score=0; function renderQ(){ const box=$('#quizBox'); if(qi>=Q.length){ const pct=Math.round(score/Q.length*100); box.innerHTML=`
Result${score}/${Q.length}

${pct}%

${pct>=72?'Above the typical 72% CWI pass mark — nice work.':'Keep going. Review the explanations and try again.'}

`; $('#qRestart').onclick=()=>{qi=0;score=0;renderQ();}; return; } const it=Q[qi]; box.innerHTML=`
Question ${qi+1} of ${Q.length}Score ${score}

${it.q}

${it.o.map((o,i)=>``).join('')}
${it.e}
`; $$('.opt',box).forEach(b=>b.onclick=()=>{ const i=+b.dataset.i; $$('.opt',box).forEach(x=>{x.disabled=true; if(+x.dataset.i===it.a) x.classList.add('right');}); if(i===it.a) score++; else b.classList.add('wrong'); $('#qExp').classList.add('show'); $('#qNext').hidden=false; $('#qNext').focus(); }); $('#qNext').onclick=()=>{qi++;renderQ();}; } renderQ(); /* ---------- library + search index ---------- */ const LIB=[ {c:'Welding Guide', t:'Welding P91: Preheat, Interpass & PWHT', d:'A step-by-step thermal cycle for creep-strength-enhanced ferritic steel, and why it fails when skipped.', k:'p91 chrome moly creep grade 91'}, {c:'Welding Guide', t:'Duplex 2205: Ferrite Balance Done Right', d:'Heat input windows, shielding gas with N₂ and how to measure ferrite in the field.', k:'duplex 2205 2209 ferrite'}, {c:'Welding Guide', t:'Aluminum TIG: AC Balance & Frequency', d:'Clean the oxide without balling the tungsten — settings for 6061 and 5083.', k:'aluminum aluminium tig gtaw 6061 4043 5356'}, {c:'Welding Guide', t:'Stainless Steel Sensitisation Explained', d:'Chromium carbides, intergranular corrosion and when L-grades matter.', k:'stainless 304 316 sensitization carbide'}, {c:'Welding Guide', t:'Cr-Mo Steels: P11 vs P22 Welding', d:'Matching consumables, hydrogen control and code PWHT exemptions.', k:'chrome moly p11 p22 cr-mo'}, {c:'Inspection', t:'AWS CWI Exam: Complete Study Plan', d:'Part A, B and C — what to study, how to use the code book and time management.', k:'cwi exam aws certified welding inspector'}, {c:'Inspection', t:'CSWIP 3.1 vs AWS CWI: Which to Choose?', d:'Recognition, exam format and career paths compared.', k:'cswip twi cwi certification'}, {c:'Inspection', t:'Ultrasonic Testing of Welds: Basics to PAUT', d:'Angle beam scanning, DAC curves and when phased array is worth it.', k:'ut ultrasonic paut tofd ndt'}, {c:'Inspection', t:'Bend, Tensile & Charpy: Destructive Testing', d:'What each test proves in procedure and welder qualification.', k:'destructive testing bend tensile charpy impact'}, {c:'Engineering', t:'ASME Section IX: Essential Variables Made Simple', d:'Essential, supplementary essential and non-essential variables with examples.', k:'asme ix bpvc wps pqr essential variables'}, {c:'Engineering', t:'Reading Weld Symbols (AWS A2.4)', d:'Arrow side, other side, tail notes and supplementary symbols decoded.', k:'weld symbols a2.4 design drawing'}, {c:'Engineering', t:'Electrode Classification Decoder', d:'Read E7018, ER70S-6, E71T-1 and stainless classifications at a glance.', k:'electrode consumables classification e7018 er70s-6'}, {c:'Metallurgy', t:'Hydrogen Cracking: Mechanism & Prevention', d:'The three ingredients of cold cracking and how preheat breaks the triangle.', k:'hydrogen cracking cold delayed preheat'}, {c:'Metallurgy', t:'The Iron-Carbon Diagram for Welders', d:'What happens in the HAZ, explained with the phase diagram.', k:'iron carbon diagram haz metallurgy phase'}, {c:'Metallurgy', t:'Schaeffler & WRC-1992 Diagrams', d:'Predict ferrite and cracking risk in stainless and dissimilar welds.', k:'schaeffler wrc delong ferrite dissimilar'} ]; const TOOLS=[ {c:'Tool', t:'Heat Input Calculator', h:'#tools', tool:'heat', k:'heat input arc energy kj/mm'}, {c:'Tool', t:'Carbon Equivalent & Preheat', h:'#tools', tool:'preheat', k:'ce carbon equivalent preheat iiw'}, {c:'Tool', t:'Filler Metal Selector', h:'#tools', tool:'filler', k:'filler electrode wire dissimilar 309 308'}, {c:'Tool', t:'Weld Metal Estimator', h:'#tools', tool:'deposit', k:'deposit weight consumption fillet'}, {c:'Tool', t:'Unit Converter', h:'#tools', tool:'convert', k:'convert units mpa ksi mm inch'}, {c:'Tool', t:'Weld Defect Troubleshooter', h:'#defects', k:'defect porosity undercut crack fusion slag'}, {c:'Tool', t:'NDT Method Chooser', h:'#ndt', k:'ndt ut rt mt pt vt et'}, {c:'Tool', t:'CWI Practice Quiz', h:'#quiz', k:'quiz practice exam questions'} ]; const cats=['All',...new Set(LIB.map(x=>x.c))]; const lf=$('#libFilter'), lib=$('#lib'); let cur='All'; cats.forEach(c=>{ const b=document.createElement('button'); b.textContent=c; b.className=c==='All'?'on':''; b.onclick=()=>setCat(c); lf.appendChild(b); }); function setCat(c){ cur=c; $$('#libFilter button').forEach(b=>b.classList.toggle('on',b.textContent===c)); renderLib(); } function renderLib(){ const items = LIB.filter(x=>cur==='All'||x.c===cur); lib.innerHTML = items.map(x=>`
${x.c}${Math.max(4,Math.round(x.d.length/14))} min read

${x.t}

${x.d}

Read guide →
`).join(''); } renderLib(); $$('[data-filter]').forEach(a=>a.addEventListener('click',()=>setCat(a.dataset.filter))); const INDEX=[...TOOLS, ...LIB.map(x=>({...x, h:'#library'}))]; const q=$('#q'), res=$('#results'); let act=-1; const esc=s=>s.replace(/[.*+?^${}()|[\]\\]/g,'\\$&'); function search(){ const v=q.value.trim().toLowerCase(); if(!v){ res.classList.remove('show'); return; } const terms=v.split(/\s+/); const hits=INDEX.map(x=>{ const hay=(x.t+' '+x.k+' '+(x.d||'')+' '+x.c).toLowerCase(); let s=0; for(const t of terms){ if(!hay.includes(t)) return null; s += x.t.toLowerCase().includes(t)?3:1; } if(x.c==='Tool') s+=1; return {x,s}; }) .filter(Boolean).sort((a,b)=>b.s-a.s).slice(0,8); act=-1; const re=new RegExp('('+terms.map(esc).join('|')+')','gi'); res.innerHTML = hits.length ? hits.map(({x},i)=>`${x.t.replace(re,'$1')}${x.c}`).join('') : `
No matches for “${q.value.replace(/</g,'<')}”. Try “P91”, “porosity” or “preheat”.
`; res.classList.add('show'); $$('a',res).forEach(a=>a.addEventListener('click',()=>{ if(a.dataset.tool) openTab(a.dataset.tool); else if(a.dataset.cat!=='Tool') setCat(a.dataset.cat); res.classList.remove('show'); })); } q.addEventListener('input',search); q.addEventListener('focus',search); q.addEventListener('keydown',e=>{ const items=$$('a',res); if(!items.length) return; if(e.key==='ArrowDown'){act=(act+1)%items.length;e.preventDefault();} else if(e.key==='ArrowUp'){act=(act-1+items.length)%items.length;e.preventDefault();} else if(e.key==='Enter'){ (items[act]||items[0]).click(); return; } else if(e.key==='Escape'){res.classList.remove('show');q.blur();return;} items.forEach((a,i)=>a.classList.toggle('active',i===act)); }); document.addEventListener('click',e=>{ if(!e.composedPath().includes($('.searchbox'))) res.classList.remove('show'); }); document.addEventListener('keydown',e=>{ const ae=root.activeElement||document.activeElement; if(e.key==='/' && !/input|select|textarea/i.test(ae.tagName) && !ae.isContentEditable){ e.preventDefault(); host.scrollIntoView({behavior:'smooth'}); setTimeout(()=>q.focus({preventScroll:true}),350); } }); /* ---------- newsletter ---------- */ $('#news').onsubmit=e=>{ e.preventDefault(); const v=$('#email').value.trim(); if(!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(v)){ $('#newsMsg').textContent='Please enter a valid email address.'; return; } $('#newsMsg').textContent='✓ Subscribed — check your inbox to confirm.'; $('#email').value=''; toast('Thanks for subscribing!'); // TODO: connect to your email provider (Mailchimp, ConvertKit, etc.) }; })();
wpChatIcon
wpChatIcon