{"id":25106,"date":"2026-11-13T02:25:22","date_gmt":"2026-11-13T02:25:22","guid":{"rendered":"https:\/\/www.mechstream.com\/?p=25106"},"modified":"2026-11-13T02:30:27","modified_gmt":"2026-11-13T02:30:27","slug":"welding-speed-and-penetration-calculator","status":"publish","type":"post","link":"https:\/\/www.mechstream.com\/es\/welding-speed-and-penetration-calculator\/","title":{"rendered":"Welding Speed and Penetration Calculator"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">The <strong>Welding Speed and Penetration Calculator<\/strong> estimates how travel speed, welding current, and arc voltage affect heat input per unit length. Compare different travel speeds and review their relative heat input to help plan welding parameters. Use the results as a preliminary reference, since actual weld penetration also depends on the material, joint design, welding process, and operator technique.<\/p>\n\n\n\n<!-- Welding Speed and Penetration Calculator: paste into a WordPress \"Custom HTML\" block. -->\n<style>\n\/* =====================================================================\n * All rules are scoped to #wspc-root so the calculator does not change\n * any other part of a WordPress page, and theme styles are overridden\n * only inside the calculator.\n * ===================================================================== *\/\n#wspc-root {\n  --steel-900: #1b2430; --steel-800: #243041; --steel-500: #5b6b82;\n  --steel-200: #d6dde7; --steel-100: #eef2f6; --white: #ffffff;\n  --text: #1b2430; --text-muted: #4a5568;\n  --accent: #1d4ed8; --accent-dark: #1e40af; --accent-soft: #eff4ff;\n  --error: #b42318; --error-soft: #fef3f2;\n  --warn: #8a5300; --warn-soft: #fff8e6; --warn-border: #f0c36d;\n  --low: #1d5fa8; --low-soft: #e8f1fb;\n  --mod: #8a5300; --mod-soft: #fff6e0;\n  --high: #b42318; --high-soft: #fdeceb;\n  --radius: 10px;\n  --shadow: 0 1px 2px rgba(16,24,40,.06), 0 4px 14px rgba(16,24,40,.06);\n  --focus: 0 0 0 3px rgba(29,78,216,.35);\n  display: block; max-width: 820px; margin: 0 auto; padding: 0;\n  font-family: system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif;\n  font-size: 16px; line-height: 1.5; color: var(--text); text-align: left;\n  letter-spacing: normal; word-spacing: normal; text-transform: none;\n}\n#wspc-root *, #wspc-root *::before, #wspc-root *::after { box-sizing: border-box; }\n#wspc-root [hidden] { display: none !important; }\n\/* Neutralise common theme rules on the elements used inside the calculator. *\/\n#wspc-root h2, #wspc-root p, #wspc-root ul, #wspc-root li, #wspc-root form,\n#wspc-root fieldset, #wspc-root legend, #wspc-root label, #wspc-root table,\n#wspc-root caption, #wspc-root th, #wspc-root td, #wspc-root section, #wspc-root div, #wspc-root span {\n  font-family: inherit; font-style: normal; letter-spacing: normal; text-transform: none; text-shadow: none;\n}\n#wspc-root p, #wspc-root ul { margin: 0; padding: 0; }\n#wspc-root li { margin: 0; }\n#wspc-root .wspc-layout { display: grid; grid-template-columns: 1fr; gap: 1.25rem; }\n#wspc-root .wspc-card {\n  background: var(--white); border: 1px solid var(--steel-200); border-radius: var(--radius);\n  box-shadow: var(--shadow); padding: 1.25rem; margin: 0;\n}\n#wspc-root .wspc-card h2 {\n  margin: 0 0 1rem; padding: 0; border: 0; font-size: 1.15rem; font-weight: 700;\n  line-height: 1.3; color: var(--steel-900);\n}\n\/* ---------- Mode toggle ---------- *\/\n#wspc-root fieldset { border: 0; margin: 0; padding: 0; min-width: 0; background: none; }\n#wspc-root legend {\n  display: block; float: none; width: auto; border: 0; font-size: 1rem; color: var(--text);\n  font-weight: 600; margin: 0 0 .45rem; padding: 0; line-height: 1.5;\n}\n#wspc-root .wspc-mode-toggle {\n  display: grid; grid-template-columns: 1fr 1fr;\n  background: var(--steel-100); border: 1px solid var(--steel-200);\n  border-radius: 999px; padding: 4px; margin: 0 0 1.25rem;\n}\n#wspc-root .wspc-mode-toggle input { position: absolute; opacity: 0; width: 1px; height: 1px; margin: 0; }\n#wspc-root .wspc-mode-toggle label {\n  display: block; text-align: center; padding: .55rem .5rem; margin: 0; border-radius: 999px;\n  cursor: pointer; font-weight: 600; color: var(--text-muted); font-size: .95rem; line-height: 1.4;\n  background: transparent;\n}\n#wspc-root .wspc-mode-toggle input:checked + label { background: var(--steel-800); color: var(--white); }\n#wspc-root .wspc-mode-toggle input:focus-visible + label { box-shadow: var(--focus); }\n\/* ---------- Fields ---------- *\/\n#wspc-root .wspc-grid-2 { display: grid; grid-template-columns: 1fr 1fr; gap: 0 1rem; }\n@media (max-width: 520px) { #wspc-root .wspc-grid-2 { grid-template-columns: 1fr; } }\n#wspc-root .wspc-field { margin: 0 0 1rem; }\n#wspc-root .wspc-field > label {\n  display: block; font-weight: 600; font-size: 1rem; color: var(--text);\n  margin: 0 0 .3rem; padding: 0; line-height: 1.5;\n}\n#wspc-root .wspc-field .wspc-hint { display: block; font-size: .85rem; color: var(--text-muted); margin-top: .25rem; line-height: 1.45; }\n#wspc-root .wspc-optional { font-weight: 400; color: var(--text-muted); font-size: .85rem; }\n#wspc-root input[type=\"text\"], #wspc-root select {\n  display: block; width: 100%; max-width: none; height: auto; min-height: 44px; margin: 0;\n  font-family: inherit; font-size: 1rem; font-weight: 400; line-height: 1.4; color: var(--text);\n  padding: .6rem .7rem; border: 1px solid #98a2b3; border-radius: 8px; background-color: var(--white);\n  box-shadow: none; outline: none;\n}\n#wspc-root select {\n  -webkit-appearance: menulist; appearance: auto; padding-right: .4rem;\n}\n#wspc-root input[type=\"text\"]:focus, #wspc-root select:focus {\n  outline: none; border-color: var(--accent); box-shadow: var(--focus); background-color: var(--white);\n}\n#wspc-root input[aria-invalid=\"true\"], #wspc-root input[aria-invalid=\"true\"]:focus {\n  border-color: var(--error); background-color: var(--error-soft);\n}\n#wspc-root .wspc-input-unit { display: grid; grid-template-columns: minmax(0, 1fr) 7.5rem; gap: .5rem; }\n#wspc-root .wspc-input-suffix { position: relative; }\n#wspc-root .wspc-input-suffix input[type=\"text\"] { padding-right: 2.4rem; }\n#wspc-root .wspc-input-suffix .wspc-suffix {\n  position: absolute; right: .75rem; top: 50%; transform: translateY(-50%);\n  color: var(--text-muted); pointer-events: none; font-weight: 600;\n}\n#wspc-root .wspc-eff-row { display: grid; grid-template-columns: minmax(0, 1fr) 6rem; gap: .75rem; align-items: center; }\n#wspc-root input[type=\"range\"] {\n  display: block; width: 100%; min-height: 44px; margin: 0; padding: 0; border: 0;\n  background: transparent; box-shadow: none; accent-color: var(--accent);\n}\n#wspc-root input[type=\"range\"]:focus-visible { outline: none; box-shadow: var(--focus); border-radius: 6px; }\n#wspc-root .wspc-error-msg { color: var(--error); font-size: .88rem; margin-top: .3rem; font-weight: 500; }\n#wspc-root .wspc-error-msg:empty { display: none; }\n#wspc-root .wspc-error-msg::before { content: \"\\26A0  \"; }\n#wspc-root .wspc-actions { display: flex; justify-content: center; margin: 1rem 0 0; }\n#wspc-root button.wspc-btn-primary {\n  display: inline-block; width: 100%; max-width: 320px; min-height: 44px; height: auto; margin: 0;\n  padding: .8rem 1.5rem; border: 1px solid transparent; border-radius: 8px;\n  font-family: inherit; font-size: 1.05rem; font-weight: 600; line-height: 1.3;\n  text-transform: none; letter-spacing: normal; text-decoration: none; text-shadow: none;\n  background: var(--accent); color: var(--white); box-shadow: none; cursor: pointer;\n}\n#wspc-root button.wspc-btn-primary:hover, #wspc-root button.wspc-btn-primary:focus { background: var(--accent-dark); color: var(--white); }\n#wspc-root button.wspc-btn-primary:focus-visible { outline: none; box-shadow: var(--focus); }\n#wspc-root .wspc-form-summary {\n  border: 1px solid var(--error); background: var(--error-soft); color: var(--error);\n  border-radius: 8px; padding: .65rem .8rem; margin: 0 0 1rem; font-weight: 500;\n}\n\/* ---------- Results ---------- *\/\n#wspc-root .wspc-hi-grid { display: grid; gap: .75rem; grid-template-columns: 1fr; margin: 0 0 1rem; }\n#wspc-root .wspc-hi-grid.wspc-two { grid-template-columns: 1fr 1fr; }\n@media (max-width: 520px) { #wspc-root .wspc-hi-grid.wspc-two { grid-template-columns: 1fr; } }\n#wspc-root .wspc-hi-box {\n  border: 1px solid var(--steel-200); border-radius: 8px; padding: .85rem 1rem;\n  background: linear-gradient(180deg, #fff, #fafbfc);\n}\n#wspc-root .wspc-cap { font-size: .82rem; text-transform: uppercase; letter-spacing: .04em; color: var(--text-muted); font-weight: 600; }\n#wspc-root .wspc-diff-box .wspc-cap { text-transform: none; letter-spacing: normal; font-size: .95rem; color: var(--text); font-weight: 400; }\n#wspc-root .wspc-hi-box .wspc-big { font-size: 1.85rem; font-weight: 700; color: var(--steel-900); line-height: 1.2; font-variant-numeric: tabular-nums; }\n#wspc-root .wspc-hi-box .wspc-big small { font-size: .95rem; font-weight: 600; color: var(--text-muted); }\n#wspc-root .wspc-hi-box .wspc-sub { color: var(--text-muted); font-size: .9rem; font-variant-numeric: tabular-nums; }\n#wspc-root .wspc-badge {\n  display: inline-block; margin-top: .45rem; padding: .2rem .6rem; border-radius: 999px;\n  font-size: .82rem; font-weight: 700; line-height: 1.4; border: 1px solid currentColor;\n}\n#wspc-root .wspc-badge.wspc-low { color: var(--low); background: var(--low-soft); }\n#wspc-root .wspc-badge.wspc-moderate { color: var(--mod); background: var(--mod-soft); }\n#wspc-root .wspc-badge.wspc-high { color: var(--high); background: var(--high-soft); }\n#wspc-root .wspc-scale { margin: .5rem 0 1rem; }\n#wspc-root .wspc-scale-bar {\n  position: relative; height: 12px; border-radius: 999px;\n  background: linear-gradient(90deg, var(--low) 0%, #e0a100 50%, var(--high) 100%);\n}\n#wspc-root .wspc-scale-marker {\n  position: absolute; top: -5px; width: 4px; height: 22px; background: var(--steel-900);\n  border-radius: 2px; transform: translateX(-50%);\n}\n#wspc-root .wspc-scale-marker span {\n  position: absolute; top: 24px; left: 50%; transform: translateX(-50%);\n  font-size: .75rem; font-weight: 700; white-space: nowrap; color: var(--steel-900);\n}\n#wspc-root .wspc-scale-labels { position: relative; height: 1.2rem; font-size: .78rem; color: var(--text-muted); margin-top: 1.6rem; }\n#wspc-root .wspc-scale-labels span { position: absolute; top: 0; white-space: nowrap; }\n#wspc-root .wspc-scale-labels .wspc-tick { transform: translateX(-50%); }\n#wspc-root .wspc-scale-labels .wspc-tick::before { content: \"\"; position: absolute; left: 50%; top: -1.95rem; width: 2px; height: 12px; background: rgba(255,255,255,.85); }\n#wspc-root .wspc-scale-ends { display: flex; justify-content: space-between; font-size: .78rem; color: var(--text-muted); font-weight: 600; }\n#wspc-root .wspc-diff-box {\n  border-left: 4px solid var(--accent); background: var(--accent-soft);\n  padding: .75rem 1rem; border-radius: 0 8px 8px 0; margin: 0 0 1rem;\n}\n#wspc-root .wspc-diff-box .wspc-big { font-size: 1.45rem; font-weight: 700; font-variant-numeric: tabular-nums; color: var(--steel-900); }\n#wspc-root table.wspc-used {\n  width: 100%; border-collapse: collapse; border: 0; font-size: .92rem; margin: 0 0 1rem;\n  background: transparent; table-layout: auto;\n}\n#wspc-root table.wspc-used caption {\n  caption-side: top; text-align: left; font-weight: 700; margin: 0 0 .35rem; padding: 0;\n  color: var(--steel-900); font-size: .95rem; font-style: normal;\n}\n#wspc-root table.wspc-used tr, #wspc-root table.wspc-used tbody { background: transparent; border: 0; }\n#wspc-root table.wspc-used th, #wspc-root table.wspc-used td {\n  padding: .4rem .25rem; border: 0; border-bottom: 1px solid var(--steel-200);\n  text-align: left; vertical-align: top; background: transparent; font-size: .92rem; line-height: 1.45;\n}\n#wspc-root table.wspc-used th { font-weight: 600; color: var(--text-muted); width: 44%; }\n#wspc-root table.wspc-used td { font-variant-numeric: tabular-nums; color: var(--text); }\n#wspc-root .wspc-explain { font-size: .95rem; }\n#wspc-root .wspc-explain p { margin: 0 0 .6rem; }\n#wspc-root .wspc-warnings {\n  border: 1px solid var(--warn-border); background: var(--warn-soft); color: var(--warn);\n  border-radius: 8px; padding: .65rem .9rem; margin: 0 0 1rem; font-size: .92rem;\n}\n#wspc-root .wspc-warnings strong { display: block; margin-bottom: .25rem; }\n#wspc-root .wspc-warnings ul { margin: 0; padding-left: 1.2rem; list-style: disc; }\n#wspc-root .wspc-disclaimer { margin-top: 1.25rem; font-size: .9rem; color: var(--text-muted); }\n@media (prefers-reduced-motion: no-preference) {\n  #wspc-root button.wspc-btn-primary, #wspc-root .wspc-mode-toggle label { transition: background-color .15s, color .15s; }\n}\n<\/style>\n<div id=\"wspc-root\" class=\"wspc\">\n  <div class=\"wspc-layout\">\n    <section class=\"wspc-card\" aria-labelledby=\"wspc-inputs-heading\">\n      <h2 id=\"wspc-inputs-heading\">Inputs<\/h2>\n      <form id=\"wspc-calc-form\" novalidate onsubmit=\"return false;\">\n        <fieldset>\n          <legend>Calculation mode<\/legend>\n          <div class=\"wspc-mode-toggle\">\n            <input type=\"radio\" id=\"wspc-mode-single\" name=\"wspc-mode\" value=\"single\" checked>\n            <label for=\"wspc-mode-single\">Estimate Heat Input<\/label>\n            <input type=\"radio\" id=\"wspc-mode-compare\" name=\"wspc-mode\" value=\"compare\">\n            <label for=\"wspc-mode-compare\">Compare Travel Speeds<\/label>\n          <\/div>\n        <\/fieldset>\n        <div id=\"wspc-form-summary\" class=\"wspc-form-summary\" role=\"alert\" tabindex=\"-1\" hidden><\/div>\n        <div class=\"wspc-field\">\n          <label for=\"wspc-process\">Welding process<\/label>\n          <select id=\"wspc-process\" name=\"process\" aria-describedby=\"wspc-process-hint\"><\/select>\n          <span class=\"wspc-hint\" id=\"wspc-process-hint\"><\/span>\n        <\/div>\n        <div class=\"wspc-grid-2\">\n          <div class=\"wspc-field\">\n            <label for=\"wspc-current\">Welding current<\/label>\n            <div class=\"wspc-input-suffix\">\n              <input type=\"text\" inputmode=\"decimal\" id=\"wspc-current\" name=\"current\" autocomplete=\"off\"\n                     aria-describedby=\"wspc-current-hint wspc-current-error\" required>\n              <span class=\"wspc-suffix\" aria-hidden=\"true\">A<\/span>\n            <\/div>\n            <span class=\"wspc-hint\" id=\"wspc-current-hint\">Amperes (A)<\/span>\n            <div class=\"wspc-error-msg\" id=\"wspc-current-error\" aria-live=\"polite\"><\/div>\n          <\/div>\n          <div class=\"wspc-field\">\n            <label for=\"wspc-voltage\">Arc voltage<\/label>\n            <div class=\"wspc-input-suffix\">\n              <input type=\"text\" inputmode=\"decimal\" id=\"wspc-voltage\" name=\"voltage\" autocomplete=\"off\"\n                     aria-describedby=\"wspc-voltage-hint wspc-voltage-error\" required>\n              <span class=\"wspc-suffix\" aria-hidden=\"true\">V<\/span>\n            <\/div>\n            <span class=\"wspc-hint\" id=\"wspc-voltage-hint\">Volts (V)<\/span>\n            <div class=\"wspc-error-msg\" id=\"wspc-voltage-error\" aria-live=\"polite\"><\/div>\n          <\/div>\n        <\/div>\n        <div class=\"wspc-field\">\n          <label for=\"wspc-speed1\" id=\"wspc-speed1-label\">Travel speed<\/label>\n          <div class=\"wspc-input-unit\">\n            <input type=\"text\" inputmode=\"decimal\" id=\"wspc-speed1\" name=\"speed1\" autocomplete=\"off\"\n                   aria-describedby=\"wspc-speed1-error\" required>\n            <select id=\"wspc-speed1-unit\" aria-label=\"Travel speed unit\">\n              <option value=\"mm\/min\">mm\/min<\/option>\n              <option value=\"cm\/min\">cm\/min<\/option>\n              <option value=\"in\/min\">in\/min<\/option>\n            <\/select>\n          <\/div>\n          <div class=\"wspc-error-msg\" id=\"wspc-speed1-error\" aria-live=\"polite\"><\/div>\n        <\/div>\n        <div class=\"wspc-field wspc-compare-only\" hidden>\n          <label for=\"wspc-speed2\">Comparison travel speed (Speed B)<\/label>\n          <div class=\"wspc-input-unit\">\n            <input type=\"text\" inputmode=\"decimal\" id=\"wspc-speed2\" name=\"speed2\" autocomplete=\"off\"\n                   aria-describedby=\"wspc-speed2-hint wspc-speed2-error\">\n            <select id=\"wspc-speed2-unit\" aria-label=\"Comparison travel speed unit\">\n              <option value=\"mm\/min\">mm\/min<\/option>\n              <option value=\"cm\/min\">cm\/min<\/option>\n              <option value=\"in\/min\">in\/min<\/option>\n            <\/select>\n          <\/div>\n          <span class=\"wspc-hint\" id=\"wspc-speed2-hint\">Uses the same current, voltage and efficiency as Speed A.<\/span>\n          <div class=\"wspc-error-msg\" id=\"wspc-speed2-error\" aria-live=\"polite\"><\/div>\n        <\/div>\n        <div class=\"wspc-field\">\n          <label for=\"wspc-efficiency-num\">Thermal efficiency factor (\u03b7)<\/label>\n          <div class=\"wspc-eff-row\">\n            <input type=\"range\" id=\"wspc-efficiency-range\" min=\"0.5\" max=\"1\" step=\"0.01\" value=\"0.8\"\n                   aria-label=\"Thermal efficiency slider\" aria-describedby=\"wspc-eff-hint\">\n            <input type=\"text\" inputmode=\"decimal\" id=\"wspc-efficiency-num\" name=\"efficiency\" autocomplete=\"off\"\n                   aria-describedby=\"wspc-eff-hint wspc-efficiency-num-error\" required>\n          <\/div>\n          <span class=\"wspc-hint\" id=\"wspc-eff-hint\">Allowed range 0.50\u20131.00. Process default is applied when you change the process.<\/span>\n          <div class=\"wspc-error-msg\" id=\"wspc-efficiency-num-error\" aria-live=\"polite\"><\/div>\n        <\/div>\n        <div class=\"wspc-field\">\n          <label for=\"wspc-thickness\">Material thickness <span class=\"wspc-optional\">(optional, context only)<\/span><\/label>\n          <div class=\"wspc-input-unit\">\n            <input type=\"text\" inputmode=\"decimal\" id=\"wspc-thickness\" name=\"thickness\" autocomplete=\"off\"\n                   aria-describedby=\"wspc-thickness-hint wspc-thickness-error\">\n            <select id=\"wspc-thickness-unit\" aria-label=\"Material thickness unit\">\n              <option value=\"mm\">mm<\/option>\n              <option value=\"in\">in<\/option>\n            <\/select>\n          <\/div>\n          <span class=\"wspc-hint\" id=\"wspc-thickness-hint\">Not used in the heat-input formula.<\/span>\n          <div class=\"wspc-error-msg\" id=\"wspc-thickness-error\" aria-live=\"polite\"><\/div>\n        <\/div>\n        <div class=\"wspc-actions\">\n          <button type=\"submit\" class=\"wspc-btn-primary\">Calculate<\/button>\n        <\/div>\n      <\/form>\n    <\/section>\n    <section class=\"wspc-card wspc-results-card\" id=\"wspc-results-card\" aria-labelledby=\"wspc-results-heading\" hidden>\n      <h2 id=\"wspc-results-heading\">Results<\/h2>\n      <div id=\"wspc-results\" aria-live=\"polite\" aria-atomic=\"true\">\n      <\/div>\n    <\/section>\n  <\/div>\n<\/div>\n<script>\n(function () {\n  \"use strict\";\n  \/* =====================================================================\n   * EDITABLE CONFIGURATION\n   * ---------------------------------------------------------------------\n   * Developers can tune everything in this block without touching the\n   * calculation code below.\n   *\n   * processes[key]:\n   *   label         \u2013 text shown in the dropdown\n   *   efficiency    \u2013 default thermal efficiency factor (\u03b7) for the process.\n   *                   Typical literature values: SMAW\/GMAW\/FCAW \u2248 0.8,\n   *                   GTAW \u2248 0.6. Adjust to your own reference standard.\n   *   thresholds    \u2013 heat input (kJ\/mm) boundaries for the qualitative\n   *                   tendency:  < low  \u2192 \"Lower relative heat input\"\n   *                              low\u2026high \u2192 \"Moderate relative heat input\"\n   *                              > high \u2192 \"Higher relative heat input\"\n   *                   These are ILLUSTRATIVE values, not code requirements.\n   *   ranges        \u2013 \"practical\" ranges used ONLY to show warnings.\n   *                   Values outside them are still calculated (never clamped).\n   * ===================================================================== *\/\n  var CONFIG = {\n    processes: {\n      gmaw:   { label: \"MIG\/MAG (GMAW)\",   efficiency: 0.80, thresholds: { low: 0.5, high: 1.5 },\n                ranges: { current: [40, 500],  voltage: [14, 40] } },\n      smaw:   { label: \"Stick (SMAW)\",     efficiency: 0.80, thresholds: { low: 0.6, high: 2.0 },\n                ranges: { current: [40, 400],  voltage: [18, 40] } },\n      gtaw:   { label: \"TIG (GTAW)\",       efficiency: 0.60, thresholds: { low: 0.3, high: 1.2 },\n                ranges: { current: [5, 400],   voltage: [8, 22]  } },\n      fcaw:   { label: \"Flux-Cored (FCAW)\", efficiency: 0.80, thresholds: { low: 0.6, high: 2.0 },\n                ranges: { current: [80, 500],  voltage: [18, 40] } },\n      custom: { label: \"Custom\",           efficiency: 0.80, thresholds: { low: 0.5, high: 1.5 },\n                ranges: { current: [5, 1000],  voltage: [5, 60]  } }\n    },\n    defaultProcess: \"gmaw\",\n    \/* Global practical ranges (warnings only). *\/\n    speedRangeMmMin:     [25, 2000],   \/\/ travel speed, mm\/min\n    heatInputRangeKjMm:  [0.1, 5.0],   \/\/ overall plausible heat input, kJ\/mm\n    thicknessRangeMm:    [0.5, 150],   \/\/ material thickness, mm\n    \/* Allowed efficiency input (hard validation, per specification). *\/\n    efficiencyMin: 0.5,\n    efficiencyMax: 1.0,\n    \/* Thickness context bands (mm) for the qualitative note. *\/\n    thinMaterialMm:  3,\n    thickMaterialMm: 12,\n    \/* Display options. *\/\n    showKjPerInch: true\n  };\n  \/* =====================================================================\n   * UNIT CONVERSIONS\n   * ---------------------------------------------------------------------\n   * Travel speed is always converted to mm\/min before calculating:\n   *   1 cm\/min = 10 mm\/min\n   *   1 in\/min = 25.4 mm\/min\n   * Thickness: 1 in = 25.4 mm.\n   * Heat input: kJ\/in = kJ\/mm \u00d7 25.4 (25.4 mm in one inch of weld).\n   * ===================================================================== *\/\n  var SPEED_TO_MM_MIN = { \"mm\/min\": 1, \"cm\/min\": 10, \"in\/min\": 25.4 };\n  var LENGTH_TO_MM = { \"mm\": 1, \"in\": 25.4 };\n  var MM_PER_IN = 25.4;\n  function speedToMmMin(value, unit) { return value * SPEED_TO_MM_MIN[unit]; }\n  function mmMinToUnit(value, unit) { return value \/ SPEED_TO_MM_MIN[unit]; }\n  \/* =====================================================================\n   * HEAT INPUT FORMULA\n   * ---------------------------------------------------------------------\n   * Arc power  P = V \u00d7 I            (W = J\/s)\n   * Net power  = P \u00d7 \u03b7              (\u03b7 = thermal efficiency, 0.5\u20131.0)\n   * Speed      S (mm\/min) \u2192 S\/60 (mm\/s)\n   * Heat input = net power \u00f7 speed  = (V \u00d7 I \u00d7 \u03b7 \u00d7 60) \/ S   (J\/mm)\n   *            \u2192 \u00f7 1000             = kJ\/mm\n   * ===================================================================== *\/\n  function heatInputKjPerMm(voltage, current, efficiency, speedMmMin) {\n    return (voltage * current * efficiency * 60) \/ (speedMmMin * 1000);\n  }\n  \/* Qualitative tendency from configurable thresholds. *\/\n  function classify(hiKjMm, processKey) {\n    var t = CONFIG.processes[processKey].thresholds;\n    if (hiKjMm < t.low)  return { key: \"low\",      label: \"Lower relative heat input\" };\n    if (hiKjMm > t.high) return { key: \"high\",     label: \"Higher relative heat input\" };\n    return { key: \"moderate\", label: \"Moderate relative heat input\" };\n  }\n  var TENDENCY_TEXT = {\n    low: \"Heat input is at the lower end of the configured range for this process. This tends toward shallower fusion and a narrower bead, with less distortion; on thicker sections it can increase the risk of lack of fusion or incomplete penetration.\",\n    moderate: \"Heat input is within the middle of the configured range for this process. This is a relative indicator only; whether penetration is adequate depends on the joint, material and procedure.\",\n    high: \"Heat input is at the upper end of the configured range for this process. This tends toward deeper fusion and a wider weld pool, but also more distortion, a larger heat-affected zone and, on thin material, a greater risk of burn-through.\"\n  };\n  \/* ---------------------------------------------------------------------\n   * Helpers\n   * ------------------------------------------------------------------- *\/\n  var NUM_RE = \/^[+-]?(\\d+(\\.\\d*)?|\\.\\d+)([eE][+-]?\\d+)?$\/;\n  var ROOT = document.getElementById(\"wspc-root\");\n  if (!ROOT) return;\n  \/* All element ids are prefixed with \"wspc-\" to avoid clashes with the WordPress page. *\/\n  function $(id) { return document.getElementById(\"wspc-\" + id); }\n  \/* NOTE: this script deliberately contains no ampersand characters, because\n     WordPress can convert them to HTML entities and break the JavaScript. *\/\n  function inRange(v, lo, hi) { return v >= lo ? v <= hi : false; }\n  function fmt(n, d) { return Number(n).toFixed(d); }\n  function trimNum(n, maxDec) {\n    \/\/ Rounded, without trailing zeros, for showing input values.\n    return String(parseFloat(Number(n).toFixed(maxDec)));\n  }\n  function escapeHtml(s) {\n    \/* \\u0026 = ampersand. Written as escapes because WordPress may rewrite a literal ampersand inside page content. *\/\n    var AMP = \"\\u0026\";\n    return String(s).replace(\/[\\u0026<>\"']\/g, function (c) {\n      if (c === AMP) return AMP + \"amp;\";\n      if (c === \"<\") return AMP + \"lt;\";\n      if (c === \">\") return AMP + \"gt;\";\n      if (c === '\"') return AMP + \"quot;\";\n      return AMP + \"#39;\";\n    });\n  }\n  \/* Parse + validate one field. Returns {ok, value} and paints the inline error. *\/\n  function readNumber(inputId, opts) {\n    var el = $(inputId), errEl = $(inputId + \"-error\");\n    var raw = el.value.trim();\n    var msg = \"\";\n    var value = NaN;\n    if (raw === \"\") {\n      if (opts.required) msg = opts.name + \" is required.\";\n    } else if (!NUM_RE.test(raw)) {\n      msg = opts.name + \" must be a number (e.g. \" + opts.example + \").\";\n    } else {\n      value = parseFloat(raw);\n      if (!isFinite(value)) msg = opts.name + \" must be a finite number.\";\n      else if (value === 0) msg = opts.name + \" cannot be zero.\";\n      else if (value < 0) msg = opts.name + \" cannot be negative.\";\n      else if (opts.min !== undefined ? (value < opts.min || value > opts.max) : false) {\n        msg = opts.name + \" must be between \" + fmt(opts.min, 2) + \" and \" + fmt(opts.max, 2) + \".\";\n      }\n    }\n    errEl.textContent = msg;\n    el.setAttribute(\"aria-invalid\", msg ? \"true\" : \"false\");\n    return { ok: !msg, value: value, empty: raw === \"\", el: el, msg: msg };\n  }\n  function clearErrors() {\n    [\"current\", \"voltage\", \"speed1\", \"speed2\", \"efficiency-num\", \"thickness\"].forEach(function (id) {\n      $(id + \"-error\").textContent = \"\";\n    });\n    [\"current\", \"voltage\", \"speed1\", \"speed2\", \"efficiency-num\", \"thickness\"].forEach(function (id) {\n      $(id).setAttribute(\"aria-invalid\", \"false\");\n    });\n    $(\"form-summary\").hidden = true;\n  }\n  function getMode() { return ROOT.querySelector('input[name=\"wspc-mode\"]:checked').value; }\n  \/* ---------------------------------------------------------------------\n   * Setup\n   * ------------------------------------------------------------------- *\/\n  var processSel = $(\"process\");\n  Object.keys(CONFIG.processes).forEach(function (key) {\n    var opt = document.createElement(\"option\");\n    opt.value = key;\n    opt.textContent = CONFIG.processes[key].label;\n    processSel.appendChild(opt);\n  });\n  function applyProcessDefaults() {\n    var p = CONFIG.processes[processSel.value];\n    setEfficiency(p.efficiency);\n    $(\"process-hint\").textContent = \"Default thermal efficiency for \" + p.label + \": \" + fmt(p.efficiency, 2) +\n      \". Tendency thresholds: < \" + p.thresholds.low + \" kJ\/mm lower, > \" + p.thresholds.high + \" kJ\/mm higher.\";\n  }\n  function setEfficiency(v) {\n    $(\"efficiency-num\").value = fmt(v, 2);\n    $(\"efficiency-range\").value = v;\n  }\n  processSel.addEventListener(\"change\", applyProcessDefaults);\n  \/\/ Keep slider and number box in sync (slider never forces a value onto invalid text).\n  $(\"efficiency-range\").addEventListener(\"input\", function () {\n    $(\"efficiency-num\").value = fmt(this.value, 2);\n    $(\"efficiency-num-error\").textContent = \"\";\n    $(\"efficiency-num\").setAttribute(\"aria-invalid\", \"false\");\n  });\n  $(\"efficiency-num\").addEventListener(\"input\", function () {\n    var v = this.value.trim();\n    if (NUM_RE.test(v)) {\n      var n = parseFloat(v);\n      if (inRange(n, CONFIG.efficiencyMin, CONFIG.efficiencyMax)) $(\"efficiency-range\").value = n;\n    }\n  });\n  \/\/ Converting the entered value when a unit selector changes, so the physical value is preserved.\n  function wireUnitConversion(inputId, selectId, table, decimals) {\n    var sel = $(selectId);\n    sel.dataset.prev = sel.value;\n    sel.addEventListener(\"change\", function () {\n      var el = $(inputId), raw = el.value.trim();\n      if (NUM_RE.test(raw) ? parseFloat(raw) > 0 : false) {\n        var mm = parseFloat(raw) * table[sel.dataset.prev];\n        el.value = trimNum(mm \/ table[sel.value], decimals);\n      }\n      sel.dataset.prev = sel.value;\n    });\n  }\n  wireUnitConversion(\"speed1\", \"speed1-unit\", SPEED_TO_MM_MIN, 2);\n  wireUnitConversion(\"speed2\", \"speed2-unit\", SPEED_TO_MM_MIN, 2);\n  wireUnitConversion(\"thickness\", \"thickness-unit\", LENGTH_TO_MM, 3);\n  \/\/ Mode switching.\n  function updateMode() {\n    var compare = getMode() === \"compare\";\n    ROOT.querySelectorAll(\".wspc-compare-only\").forEach(function (el) { el.hidden = !compare; });\n    $(\"speed1-label\").textContent = compare ? \"Travel speed (Speed A)\" : \"Travel speed\";\n    $(\"speed2\").required = compare;\n    clearErrors();\n    showPlaceholder();\n  }\n  ROOT.querySelectorAll('input[name=\"wspc-mode\"]').forEach(function (r) { r.addEventListener(\"change\", updateMode); });\n  \/* Results are hidden until a successful Calculate. *\/\n  function showPlaceholder() {\n    $(\"results-card\").hidden = true;\n    $(\"results\").innerHTML = \"\";\n  }\n  \/* ---------------------------------------------------------------------\n   * Calculate\n   * ------------------------------------------------------------------- *\/\n  $(\"calc-form\").addEventListener(\"submit\", function (e) {\n    e.preventDefault();\n    calculate();\n  });\n  function calculate() {\n    clearErrors();\n    var compare = getMode() === \"compare\";\n    var fields = [\n      readNumber(\"current\",   { name: \"Welding current\", required: true, example: \"180\" }),\n      readNumber(\"voltage\",   { name: \"Arc voltage\", required: true, example: \"24\" }),\n      readNumber(\"speed1\",    { name: compare ? \"Travel speed A\" : \"Travel speed\", required: true, example: \"300\" })\n    ];\n    var speed2 = null;\n    if (compare) {\n      speed2 = readNumber(\"speed2\", { name: \"Travel speed B\", required: true, example: \"450\" });\n      fields.push(speed2);\n    }\n    \/\/ Efficiency uses its own error id.\n    var effEl = $(\"efficiency-num\");\n    var eff = (function () {\n      var r = readNumber(\"efficiency-num\", {\n        name: \"Thermal efficiency\", required: true, example: \"0.80\",\n        min: CONFIG.efficiencyMin, max: CONFIG.efficiencyMax\n      });\n      return r;\n    })();\n    fields.push(eff);\n    var thick = readNumber(\"thickness\", { name: \"Material thickness\", required: false, example: \"6\" });\n    fields.push(thick);\n    var bad = fields.filter(function (f) { return !f.ok; });\n    if (bad.length) {\n      var summary = $(\"form-summary\");\n      summary.textContent = bad.length === 1\n        ? \"Please fix 1 field before calculating.\"\n        : \"Please fix \" + bad.length + \" fields before calculating.\";\n      summary.hidden = false;\n      bad[0].el.focus();\n      showPlaceholder();\n      return;\n    }\n    var processKey = processSel.value;\n    var proc = CONFIG.processes[processKey];\n    var I = fields[0].value, V = fields[1].value, n = eff.value;\n    var u1 = $(\"speed1-unit\").value;\n    var s1 = speedToMmMin(fields[2].value, u1);\n    var hi1 = heatInputKjPerMm(V, I, n, s1);\n    var res = {\n      processKey: processKey, proc: proc, I: I, V: V, eff: n,\n      speeds: [{ name: \"A\", raw: fields[2].value, unit: u1, mmMin: s1, hi: hi1, cls: classify(hi1, processKey) }],\n      thicknessMm: thick.empty ? null : thick.value * LENGTH_TO_MM[$(\"thickness-unit\").value],\n      thicknessRaw: thick.empty ? null : thick.value, thicknessUnit: $(\"thickness-unit\").value\n    };\n    if (compare) {\n      var u2 = $(\"speed2-unit\").value;\n      var s2 = speedToMmMin(speed2.value, u2);\n      var hi2 = heatInputKjPerMm(V, I, n, s2);\n      res.speeds.push({ name: \"B\", raw: speed2.value, unit: u2, mmMin: s2, hi: hi2, cls: classify(hi2, processKey) });\n    }\n    res.warnings = collectWarnings(res);\n    renderResults(res, compare);\n  }\n  \/* Warnings: values outside practical ranges are reported, never clamped. *\/\n  function collectWarnings(r) {\n    var w = [];\n    var cr = r.proc.ranges.current, vr = r.proc.ranges.voltage;\n    if (r.I < cr[0] || r.I > cr[1])\n      w.push(\"Current \" + trimNum(r.I, 2) + \" A is outside the typical \" + r.proc.label + \" range of \" + cr[0] + \"\u2013\" + cr[1] + \" A.\");\n    if (r.V < vr[0] || r.V > vr[1])\n      w.push(\"Voltage \" + trimNum(r.V, 2) + \" V is outside the typical \" + r.proc.label + \" range of \" + vr[0] + \"\u2013\" + vr[1] + \" V.\");\n    var sr = CONFIG.speedRangeMmMin, hr = CONFIG.heatInputRangeKjMm;\n    r.speeds.forEach(function (s) {\n      var lbl = r.speeds.length > 1 ? \"Travel speed \" + s.name : \"Travel speed\";\n      if (s.mmMin < sr[0] || s.mmMin > sr[1])\n        w.push(lbl + \" (\" + fmt(s.mmMin, 1) + \" mm\/min) is outside the practical range of \" + sr[0] + \"\u2013\" + sr[1] + \" mm\/min.\");\n      if (s.hi < hr[0] || s.hi > hr[1])\n        w.push(\"Heat input\" + (r.speeds.length > 1 ? \" at Speed \" + s.name : \"\") + \" (\" + fmt(s.hi, 3) + \" kJ\/mm) is outside the typical range of \" + hr[0] + \"\u2013\" + hr[1] + \" kJ\/mm. Double-check your inputs.\");\n    });\n    if (r.thicknessMm !== null) {\n      var tr = CONFIG.thicknessRangeMm;\n      if (r.thicknessMm < tr[0] || r.thicknessMm > tr[1])\n        w.push(\"Material thickness (\" + fmt(r.thicknessMm, 2) + \" mm) is outside the range of \" + tr[0] + \"\u2013\" + tr[1] + \" mm covered by the context notes.\");\n    }\n    if (r.speeds.length === 2 ? Math.abs(r.speeds[0].mmMin - r.speeds[1].mmMin) < 1e-9 : false)\n      w.push(\"Speed A and Speed B are the same, so there is no difference to compare.\");\n    return w;\n  }\n  function thicknessNote(r) {\n    if (r.thicknessMm === null) return \"\";\n    var t = r.thicknessMm;\n    var shown = trimNum(r.thicknessRaw, 3) + \" \" + r.thicknessUnit +\n      (r.thicknessUnit === \"in\" ? \" (\" + fmt(t, 2) + \" mm)\" : \" (\" + fmt(t \/ MM_PER_IN, 3) + \" in)\");\n    var text;\n    if (t < CONFIG.thinMaterialMm) {\n      text = \"Thin material is sensitive to heat input: higher values raise the risk of burn-through and distortion, so faster travel or lower current is often used.\";\n    } else if (t > CONFIG.thickMaterialMm) {\n      text = \"Thick material may need joint preparation (bevels), multiple passes and possibly preheat to achieve full fusion; a single-pass heat-input value says little about through-thickness penetration.\";\n    } else {\n      text = \"For medium thickness, joint design and fit-up strongly influence whether full penetration is achieved at a given heat input.\";\n    }\n    return \"<p><strong>Material thickness context \u2013 \" + escapeHtml(shown) + \":<\/strong> \" + text + \" Thickness is not used in the calculation.<\/p>\";\n  }\n  function scaleHtml(r) {\n    \/\/ Visual position of each result on a scale from 0 to 1.5 \u00d7 high threshold.\n    var t = r.proc.thresholds;\n    var max = t.high * 1.5;\n    var markers = r.speeds.map(function (s) {\n      var pct = Math.max(0, Math.min(100, (s.hi \/ max) * 100));\n      var lab = r.speeds.length > 1 ? s.name : fmt(s.hi, 3);\n      return '<div class=\"wspc-scale-marker\" style=\"left:' + pct.toFixed(1) + '%\"><span>' + lab + '<\/span><\/div>';\n    }).join(\"\");\n    return '<div class=\"wspc-scale\" aria-hidden=\"true\"><div class=\"wspc-scale-bar\">' + markers + '<\/div>' +\n      '<div class=\"wspc-scale-labels\">' +\n      '<span class=\"wspc-tick\" style=\"left:' + (t.low \/ max * 100).toFixed(1) + '%\">' + t.low + ' kJ\/mm<\/span>' +\n      '<span class=\"wspc-tick\" style=\"left:' + (t.high \/ max * 100).toFixed(1) + '%\">' + t.high + ' kJ\/mm<\/span>' +\n      '<\/div><div class=\"wspc-scale-ends\"><span>\u2190 Lower<\/span><span>Higher \u2192<\/span><\/div><\/div>';\n  }\n  function hiBox(s, title) {\n    var kjIn = s.hi * MM_PER_IN;\n    return '<div class=\"wspc-hi-box\">' +\n      '<div class=\"wspc-cap\">' + title + '<\/div>' +\n      '<div class=\"wspc-big\">' + fmt(s.hi, 3) + ' <small>kJ\/mm<\/small><\/div>' +\n      (CONFIG.showKjPerInch ? '<div class=\"wspc-sub\">' + fmt(kjIn, 3) + ' kJ\/in<\/div>' : '') +\n      '<div class=\"wspc-sub\">at ' + trimNum(s.raw, 3) + ' ' + s.unit + (s.unit !== \"mm\/min\" ? ' (' + fmt(s.mmMin, 1) + ' mm\/min)' : '') + '<\/div>' +\n      '<span class=\"wspc-badge wspc-' + s.cls.key + '\">' + s.cls.label + '<\/span>' +\n      '<\/div>';\n  }\n  function renderResults(r, compare) {\n    var html = \"\";\n    var a = r.speeds[0], b = r.speeds[1];\n    if (r.warnings.length) {\n      html += '<div class=\"wspc-warnings\" role=\"note\"><strong>Check these values<\/strong><ul>' +\n        r.warnings.map(function (w) { return \"<li>\" + escapeHtml(w) + \"<\/li>\"; }).join(\"\") + \"<\/ul><\/div>\";\n    }\n    if (!compare) {\n      html += '<div class=\"wspc-hi-grid\">' + hiBox(a, \"Estimated heat input\") + \"<\/div>\";\n    } else {\n      html += '<div class=\"wspc-hi-grid wspc-two\">' + hiBox(a, \"Speed A\") + hiBox(b, \"Speed B\") + \"<\/div>\";\n      \/\/ Percentage difference of Speed B relative to Speed A.\n      var pct = ((b.hi - a.hi) \/ a.hi) * 100;\n      var spdPct = ((b.mmMin - a.mmMin) \/ a.mmMin) * 100;\n      var dir = Math.abs(pct) < 0.05 ? \"no change in\" : (pct > 0 ? \"higher\" : \"lower\");\n      html += '<div class=\"wspc-diff-box\"><div class=\"wspc-cap\">Heat input difference (B vs. A)<\/div>' +\n        '<div class=\"wspc-big\">' + (pct > 0 ? \"+\" : \"\") + fmt(pct, 1) + '%<\/div>' +\n        '<div>Speed B is ' + (spdPct >= 0 ? (Math.abs(spdPct) < 0.05 ? \"the same as\" : fmt(spdPct, 1) + \"% faster than\") : fmt(Math.abs(spdPct), 1) + \"% slower than\") +\n        ' Speed A, giving ' + (dir === \"no change in\" ? \"no change in heat input\" : fmt(Math.abs(pct), 1) + \"% \" + dir + \" heat input per unit length\") + '.<\/div><\/div>';\n    }\n    html += scaleHtml(r);\n    \/\/ Explanation\n    html += '<div class=\"wspc-explain\">';\n    if (!compare) {\n      html += \"<p><strong>\" + a.cls.label + \".<\/strong> \" + TENDENCY_TEXT[a.cls.key] + \"<\/p>\";\n    } else {\n      html += \"<p>With current, voltage and efficiency held constant, heat input changes in inverse proportion to travel speed: <strong>slower travel generally increases heat input per unit length<\/strong>, while <strong>faster travel generally reduces it<\/strong>.<\/p>\";\n      html += \"<p><strong>Speed A:<\/strong> \" + a.cls.label.toLowerCase() + \". <strong>Speed B:<\/strong> \" + b.cls.label.toLowerCase() + \". \" +\n        (b.hi > a.hi ? \"Speed B would generally tend toward deeper fusion and a wider bead than Speed A, with more heat into the part.\"\n          : b.hi < a.hi ? \"Speed B would generally tend toward shallower fusion and a narrower bead than Speed A, with less heat into the part.\"\n          : \"Both speeds give the same heat input.\") + \"<\/p>\";\n    }\n    html += thicknessNote(r);\n    html += '<p>This is a <strong>relative indicator<\/strong> based on configurable thresholds for ' + escapeHtml(r.proc.label) +\n      ' (below ' + r.proc.thresholds.low + ' kJ\/mm lower, above ' + r.proc.thresholds.high + ' kJ\/mm higher). It is not a measured or guaranteed penetration depth.<\/p>';\n    html += \"<\/div>\";\n    \/\/ Inputs used\n    html += '<table class=\"wspc-used\"><caption>Values used<\/caption><tbody>' +\n      row(\"Welding process\", escapeHtml(r.proc.label)) +\n      row(\"Welding current\", trimNum(r.I, 3) + \" A\") +\n      row(\"Arc voltage\", trimNum(r.V, 3) + \" V\") +\n      row(\"Arc power (V \u00d7 I)\", fmt(r.V * r.I \/ 1000, 3) + \" kW\") +\n      row(\"Thermal efficiency (\u03b7)\", fmt(r.eff, 2)) +\n      r.speeds.map(function (s) {\n        return row(compare ? \"Travel speed \" + s.name : \"Travel speed\",\n          trimNum(s.raw, 3) + \" \" + s.unit + (s.unit !== \"mm\/min\" ? \" = \" + fmt(s.mmMin, 1) + \" mm\/min\" : \"\"));\n      }).join(\"\") +\n      (r.thicknessMm !== null ? row(\"Material thickness\", trimNum(r.thicknessRaw, 3) + \" \" + r.thicknessUnit + \" (context only)\") : \"\") +\n      \"<\/tbody><\/table>\";\n    html += '<p class=\"wspc-disclaimer\">Preliminary estimate only. Penetration also depends on process, material, joint preparation, electrode or wire, polarity, shielding gas and technique. Always verify with a qualified WPS, test welds and the equipment manual.<\/p>';\n    $(\"results\").innerHTML = html;\n    $(\"results-card\").hidden = false;\n    $(\"results-card\").scrollIntoView({ behavior: \"smooth\", block: \"start\" });\n  }\n  function row(k, v) { return \"<tr><th scope=\\\"row\\\">\" + k + \"<\/th><td>\" + v + \"<\/td><\/tr>\"; }\n  \/\/ Initial state\n  processSel.value = CONFIG.defaultProcess;\n  applyProcessDefaults();\n  updateMode();\n})();\n<\/script>\n","protected":false},"excerpt":{"rendered":"<p>The Welding Speed and Penetration Calculator estimates how travel speed, welding current, and arc voltage affect heat input per unit length. Compare different travel speeds&#8230;<\/p>","protected":false},"author":2,"featured_media":25107,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"pmpro_default_level":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_hide_featured_image":false,"_jetpack_featured_image_duplicate_dismissed":0,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[8808],"tags":[8857,8793,8858],"class_list":["post-25106","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-manufacturing-and-processes","tag-weld-penetration","tag-welding-calculator","tag-welding-speed","pmpro-has-access"],"acf":[],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/www.mechstream.com\/wp-content\/uploads\/2026\/11\/Welding-Speed-and-Penetration-Calculator.png","_links":{"self":[{"href":"https:\/\/www.mechstream.com\/es\/wp-json\/wp\/v2\/posts\/25106","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mechstream.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mechstream.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/es\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/es\/wp-json\/wp\/v2\/comments?post=25106"}],"version-history":[{"count":0,"href":"https:\/\/www.mechstream.com\/es\/wp-json\/wp\/v2\/posts\/25106\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/es\/wp-json\/wp\/v2\/media\/25107"}],"wp:attachment":[{"href":"https:\/\/www.mechstream.com\/es\/wp-json\/wp\/v2\/media?parent=25106"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mechstream.com\/es\/wp-json\/wp\/v2\/categories?post=25106"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mechstream.com\/es\/wp-json\/wp\/v2\/tags?post=25106"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}