{"id":24953,"date":"2026-10-22T02:49:57","date_gmt":"2026-10-22T02:49:57","guid":{"rendered":"https:\/\/www.mechstream.com\/?p=24953"},"modified":"2026-10-22T02:49:59","modified_gmt":"2026-10-22T02:49:59","slug":"wear-resistance-index-estimation-calculator","status":"publish","type":"post","link":"https:\/\/www.mechstream.com\/fr\/wear-resistance-index-estimation-calculator\/","title":{"rendered":"Wear Resistance Index Estimation Calculator"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">The Wear Resistance Index Estimation Calculator is a practical online engineering tool designed to help engineers, material scientists, and manufacturing professionals estimate material wear performance under different operating conditions. Based on Archard&#8217;s wear equation, this calculator estimates wear volume, specific wear rate, and relative wear resistance using parameters such as material hardness, normal load, sliding distance, and wear coefficient. Whether you&#8217;re evaluating industrial machinery components, metalworking tools, or surface-treated materials, this easy-to-use calculator supports material comparison, wear analysis, and engineering decision-making. Results are approximate and depend on material properties, contact conditions, and wear mechanisms.<\/p>\n\n\n\n<!-- Wear Resistance Index Estimation Calculator (inputs + results only). CSS scoped to .wri-root; vanilla JS. -->\n<div id=\"wri-calculator\" class=\"wri-root\" data-wri-widget=\"wear-resistance-index\">\n<style>\n.wri-root,.wri-root *,.wri-root *::before,.wri-root *::after{box-sizing:border-box}\n.wri-root{\n  --wri-bg:#ffffff;--wri-card:#ffffff;--wri-navy:#0b2545;--wri-text:#1f2a37;--wri-muted:#556070;--wri-soft:#6f7a89;\n  --wri-line:#d9e0e8;--wri-line-soft:#e8edf3;--wri-input:#f3f5f8;--wri-accent:#1d5fd1;--wri-accent-dark:#154aa8;--wri-accent-soft:#eaf1fd;\n  --wri-ref:#64748b;--wri-ok:#0a7a45;--wri-ok-soft:#e6f4ec;--wri-warn:#7a5200;--wri-warn-soft:#fff6e0;--wri-err:#c0281b;--wri-err-soft:#fdecea;\n  width:100%;max-width:1180px;margin:24px auto;padding:28px;background:var(--wri-bg);color:var(--wri-text);\n  border:1px solid var(--wri-line-soft);border-radius:20px;font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,\"Helvetica Neue\",Arial,sans-serif;\n  font-size:16px;line-height:1.55;-webkit-font-smoothing:antialiased;text-align:left\n}\n.wri-root p,.wri-root ul,.wri-root ol,.wri-root li,.wri-root h2,.wri-root h3,.wri-root h4,.wri-root table,.wri-root dl,.wri-root dd,.wri-root dt,.wri-root details,.wri-root summary,.wri-root fieldset,.wri-root header,.wri-root section,.wri-root article{margin:0;padding:0;border:0;background:none;text-transform:none;letter-spacing:normal;font-family:inherit;color:inherit;box-shadow:none}\n.wri-root [hidden],.wri-root .wri-hide{display:none!important}\n.wri-root .wri-layout{display:grid;grid-template-columns:minmax(0,1fr);gap:16px}\n.wri-root .wri-card{background:var(--wri-card);border:1px solid var(--wri-line-soft);border-radius:16px;padding:22px;box-shadow:0 1px 3px rgba(11,37,69,.06);min-width:0}\n.wri-root .wri-col>.wri-card+.wri-card{margin-top:16px}\n.wri-root .wri-card-title{color:var(--wri-navy);font-size:1.08rem;font-weight:700;line-height:1.25;display:flex;align-items:center;gap:10px;margin:0 0 4px}\n.wri-root .wri-step{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;flex:0 0 24px;border-radius:50%;background:var(--wri-accent-soft);color:var(--wri-accent);font-size:.8rem;font-weight:700}\n.wri-root .wri-card-note{color:var(--wri-muted);font-size:.9rem;margin:0 0 16px}\n.wri-root .wri-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px 18px}\n.wri-root .wri-field{min-width:0}\n.wri-root .wri-span{grid-column:1\/-1}\n.wri-root .wri-label{display:block;font-size:.9rem;font-weight:650;color:var(--wri-navy);margin:0 0 6px;line-height:1.35}\n.wri-root .wri-opt{font-weight:400;color:var(--wri-soft)}\n.wri-root .wri-hint{display:block;color:var(--wri-soft);font-size:.8rem;margin-top:5px;line-height:1.4}\n.wri-root .wri-hint:empty{display:none}\n.wri-root .wri-error{display:block;color:var(--wri-err);font-size:.82rem;margin-top:4px;line-height:1.4}\n.wri-root .wri-error:empty{display:none}\n.wri-root .wri-row{display:grid;grid-template-columns:minmax(0,1fr) 96px;gap:8px}\n.wri-root input[type=text],.wri-root select{\n  -webkit-appearance:none;appearance:none;width:100%;max-width:none;min-height:46px;height:auto;margin:0;padding:10px 13px;font:inherit;font-size:16px;line-height:1.3;\n  color:var(--wri-text);background-color:var(--wri-input);border:1px solid var(--wri-line);border-radius:10px;box-shadow:none;outline:none;transition:border-color .15s ease,box-shadow .15s ease,background-color .15s ease\n}\n.wri-root select{padding-right:34px;background-image:linear-gradient(45deg,transparent 50%,#5b6675 50%),linear-gradient(135deg,#5b6675 50%,transparent 50%);background-position:calc(100% - 18px) 20px,calc(100% - 13px) 20px;background-size:5px 5px,5px 5px;background-repeat:no-repeat;cursor:pointer}\n.wri-root input[type=text]:focus,.wri-root select:focus{border-color:var(--wri-accent);background-color:#fff;box-shadow:0 0 0 4px rgba(29,95,209,.16)}\n.wri-root select:disabled{opacity:.6;cursor:not-allowed}\n.wri-root .wri-invalid{border-color:var(--wri-err)!important;box-shadow:0 0 0 3px rgba(192,40,27,.12)!important}\n.wri-root .wri-check{display:flex;align-items:flex-start;gap:9px;margin-top:10px;font-size:.88rem;color:var(--wri-text);cursor:pointer;line-height:1.4}\n.wri-root .wri-check input{width:18px;height:18px;min-height:0;margin:1px 0 0;flex:0 0 18px;accent-color:var(--wri-accent);cursor:pointer;position:static;opacity:1}\n.wri-root .wri-check-strong{font-weight:650;color:var(--wri-navy)}\n.wri-root .wri-chips{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px}\n.wri-root .wri-chip{-webkit-appearance:none;appearance:none;margin:0;min-height:32px;min-width:0;padding:4px 12px;border-radius:999px;border:1px solid var(--wri-line);background:#fff;color:var(--wri-accent-dark);font:inherit;font-size:.82rem;font-weight:600;line-height:1.2;cursor:pointer;box-shadow:none;text-transform:none;letter-spacing:normal;width:auto;float:none}\n.wri-root .wri-chip:hover,.wri-root .wri-chip:focus{border-color:var(--wri-accent);background:var(--wri-accent-soft);color:var(--wri-accent-dark)}\n.wri-root .wri-chip:focus-visible{outline:3px solid rgba(29,95,209,.35);outline-offset:1px}\n.wri-root .wri-badge{display:inline-block;padding:3px 10px;border-radius:999px;font-size:.74rem;font-weight:700;letter-spacing:.02em;line-height:1.4;vertical-align:middle}\n.wri-root .wri-badge-warn{background:#fdebb8;color:var(--wri-warn)}\n.wri-root .wri-badge-ok{background:var(--wri-ok-soft);color:var(--wri-ok)}\n.wri-root .wri-badge-info{background:var(--wri-accent-soft);color:var(--wri-accent-dark)}\n.wri-root .wri-subpanel{margin-top:14px;padding:14px;border-radius:12px;background:#f8fafc;border:1px solid var(--wri-line-soft)}\n.wri-root .wri-actions{display:flex;justify-content:center;margin-top:18px}\n.wri-root .wri-btn{-webkit-appearance:none;appearance:none;display:inline-flex;align-items:center;justify-content:center;min-height:46px;min-width:0;margin:0;padding:10px 20px;border-radius:10px;border:1px solid transparent;font:inherit;font-size:.96rem;font-weight:650;line-height:1.2;cursor:pointer;text-decoration:none;text-transform:none;letter-spacing:normal;box-shadow:none;transition:background .15s,border-color .15s,color .15s;float:none;width:auto}\n.wri-root .wri-btn-primary{background:var(--wri-accent);color:#fff;flex:0 0 auto;width:200px;max-width:100%}\n.wri-root .wri-btn-primary:hover,.wri-root .wri-btn-primary:focus{background:var(--wri-accent-dark);color:#fff}\n.wri-root .wri-btn:focus-visible{outline:3px solid rgba(29,95,209,.35);outline-offset:2px}\n.wri-root .wri-form-msg{color:var(--wri-err);font-size:.88rem;margin-top:10px}\n.wri-root .wri-form-msg:empty{display:none}\n.wri-root .wri-results-head{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:8px;margin-bottom:14px}\n.wri-root .wri-r-msg{padding:12px 14px;border-radius:12px;background:var(--wri-err-soft);color:#8c1d13;font-size:.9rem;margin-bottom:12px}\n.wri-root .wri-r-msg:empty{display:none}\n.wri-root .wri-dim{opacity:.45}\n.wri-root .wri-main{background:var(--wri-accent-soft);border:1px solid #cfdef8;border-radius:14px;padding:16px 18px}\n.wri-root .wri-main-label{font-size:.76rem;font-weight:700;color:var(--wri-accent-dark);text-transform:uppercase;letter-spacing:.05em}\n.wri-root .wri-main-value{font-size:clamp(1.9rem,4.6vw,2.6rem);font-weight:750;letter-spacing:-.02em;line-height:1.1;margin-top:4px;color:var(--wri-navy);font-variant-numeric:tabular-nums;overflow-wrap:anywhere}\n.wri-root .wri-unit{font-size:.5em;font-weight:600;color:var(--wri-muted);letter-spacing:0;margin-left:6px}\n.wri-root .wri-main-sub{font-size:.85rem;color:var(--wri-muted);margin-top:6px}\n.wri-root .wri-kpis{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;margin-top:12px}\n.wri-root .wri-kpi{background:#f8fafc;border:1px solid var(--wri-line-soft);border-radius:12px;padding:11px 13px;min-width:0}\n.wri-root .wri-kpi-label{font-size:.72rem;font-weight:700;color:var(--wri-muted);text-transform:uppercase;letter-spacing:.04em;line-height:1.3}\n.wri-root .wri-kpi-value{font-size:1.08rem;font-weight:700;margin-top:3px;color:var(--wri-navy);font-variant-numeric:tabular-nums;overflow-wrap:anywhere}\n.wri-root .wri-kpi-sub{font-size:.78rem;color:var(--wri-muted);margin-top:2px;overflow-wrap:anywhere}\n.wri-root .wri-index{margin-top:12px;border:1px solid var(--wri-line);border-radius:14px;padding:16px 18px;background:#fff}\n.wri-root .wri-index-top{display:flex;flex-wrap:wrap;align-items:center;gap:8px}\n.wri-root .wri-index-value{font-size:clamp(1.7rem,4vw,2.2rem);font-weight:750;color:var(--wri-navy);line-height:1.1;margin-top:6px;font-variant-numeric:tabular-nums;overflow-wrap:anywhere}\n.wri-root .wri-index-text{font-size:.9rem;color:var(--wri-text);margin-top:6px}\n.wri-root .wri-index-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;margin-top:12px}\n.wri-root .wri-noref{margin-top:12px;padding:12px 14px;border-radius:12px;border:1px dashed var(--wri-line);color:var(--wri-muted);font-size:.88rem}\n.wri-root .wri-toast{position:fixed;left:50%;bottom:24px;transform:translateX(-50%) translateY(20px);background:var(--wri-navy);color:#fff;padding:10px 18px;border-radius:999px;font-size:.9rem;opacity:0;pointer-events:none;transition:opacity .2s,transform .2s;z-index:99999;max-width:calc(100% - 32px);text-align:center}\n.wri-root .wri-toast.wri-show{opacity:1;transform:translateX(-50%) translateY(0)}\n@media (max-width:640px){\n  .wri-root{padding:18px 14px;border-radius:14px;margin:12px auto}\n  .wri-root .wri-card{padding:16px 14px;border-radius:14px}\n  .wri-root .wri-grid{grid-template-columns:1fr}\n}\n@media (max-width:400px){\n  .wri-root .wri-kpis,.wri-root .wri-index-grid{grid-template-columns:1fr}\n  .wri-root .wri-row{grid-template-columns:minmax(0,1fr) 84px}\n}\n@media (prefers-reduced-motion:reduce){.wri-root *{transition:none!important}}\n<\/style>\n<form class=\"wri-form\" novalidate onsubmit=\"return false;\">\n<div class=\"wri-layout\">\n<div class=\"wri-col\">\n<section class=\"wri-card\" aria-labelledby=\"wri-h-mat\">\n<h3 class=\"wri-card-title\" id=\"wri-h-mat\"><span class=\"wri-step\" aria-hidden=\"true\">1<\/span>Material &amp; Hardness<\/h3>\n<p class=\"wri-card-note\">Select the evaluated material and enter its hardness and wear coefficient.<\/p>\n<div class=\"wri-grid\">\n<div class=\"wri-field wri-span\">\n<label class=\"wri-label\" for=\"wri-mat\">Material Type<\/label>\n<select id=\"wri-mat\" name=\"material\">\n<option value=\"carbon\">Carbon Steel<\/option>\n<option value=\"alloy\" selected>Alloy Steel<\/option>\n<option value=\"stainless\">Stainless Steel<\/option>\n<option value=\"tool\">Tool Steel<\/option>\n<option value=\"castiron\">Cast Iron<\/option>\n<option value=\"aluminum\">Aluminum Alloy<\/option>\n<option value=\"copper\">Copper Alloy<\/option>\n<option value=\"titanium\">Titanium Alloy<\/option>\n<option value=\"custom\">Custom Material<\/option>\n<\/select>\n<label class=\"wri-check\" for=\"wri-demo\"><input type=\"checkbox\" id=\"wri-demo\" name=\"demo\" checked><span><span class=\"wri-check-strong\">Demonstration mode<\/span> &#8212; fill hypothetical example hardness and K values when a material is selected.<\/span><\/label>\n<span class=\"wri-hint\" id=\"wri-mat-status\" aria-live=\"polite\"><\/span>\n<\/div>\n<div class=\"wri-field\">\n<label class=\"wri-label\" for=\"wri-hard\" id=\"wri-hard-label\">Material Hardness (HV)<\/label>\n<div class=\"wri-row\">\n<input id=\"wri-hard\" name=\"hardness\" type=\"text\" inputmode=\"decimal\" autocomplete=\"off\" spellcheck=\"false\" value=\"300\" aria-describedby=\"wri-hard-hint wri-hard-err\">\n<select id=\"wri-scale\" name=\"hardnessScale\" aria-label=\"Hardness scale\"><option value=\"HV\" selected>HV<\/option><option value=\"HBW\">HB \/ HBW<\/option><option value=\"HRC\">HRC<\/option><\/select>\n<\/div>\n<span class=\"wri-hint\" id=\"wri-hard-hint\">Enter the Vickers hardness of the material.<\/span>\n<span class=\"wri-error\" id=\"wri-hard-err\" role=\"alert\"><\/span>\n<\/div>\n<div class=\"wri-field wri-hide\" id=\"wri-src-wrap\" hidden>\n<label class=\"wri-label\" for=\"wri-src\">Hardness conversion to HV<\/label>\n<select id=\"wri-src\" name=\"conversionSource\">\n<option value=\"own\" selected>Use HV from my verified conversion table<\/option>\n<option value=\"e140\">ASTM E140 Table 1 &#8212; non-austenitic steels (approx.)<\/option>\n<\/select>\n<span class=\"wri-hint\" id=\"wri-src-hint\">No universal factor is applied between hardness scales.<\/span>\n<\/div>\n<div class=\"wri-field wri-hide\" id=\"wri-eq-wrap\" hidden>\n<label class=\"wri-label\" for=\"wri-eq\">Equivalent Hardness (HV)<\/label>\n<input id=\"wri-eq\" name=\"equivalentHV\" type=\"text\" inputmode=\"decimal\" autocomplete=\"off\" spellcheck=\"false\" placeholder=\"From a verified, material-specific table\" aria-describedby=\"wri-eq-hint wri-eq-err\">\n<span class=\"wri-hint\" id=\"wri-eq-hint\">Read this value from a conversion table that is valid for your material.<\/span>\n<span class=\"wri-error\" id=\"wri-eq-err\" role=\"alert\"><\/span>\n<\/div>\n<div class=\"wri-field wri-span\">\n<label class=\"wri-label\" for=\"wri-k\">Dimensionless Wear Coefficient (K)<\/label>\n<input id=\"wri-k\" name=\"wearCoefficient\" type=\"text\" inputmode=\"text\" autocomplete=\"off\" spellcheck=\"false\" value=\"5e-5\" aria-describedby=\"wri-k-hint wri-k-err\">\n<div class=\"wri-chips\" role=\"group\" aria-label=\"Quick wear coefficient values\">\n<button type=\"button\" class=\"wri-chip\" data-k=\"1e-3\">1e-3<\/button><button type=\"button\" class=\"wri-chip\" data-k=\"1e-4\">1e-4<\/button><button type=\"button\" class=\"wri-chip\" data-k=\"1e-5\">1e-5<\/button><button type=\"button\" class=\"wri-chip\" data-k=\"1e-6\">1e-6<\/button>\n<\/div>\n<span class=\"wri-hint\" id=\"wri-k-hint\">Use an experimentally determined K for this material pair, lubrication condition and wear mechanism. Scientific notation such as 1e-4 or 1&#215;10^-4 is accepted. K is not a universal material constant.<\/span>\n<span class=\"wri-error\" id=\"wri-k-err\" role=\"alert\"><\/span>\n<\/div>\n<\/div>\n<\/section>\n<section class=\"wri-card\" aria-labelledby=\"wri-h-load\">\n<h3 class=\"wri-card-title\" id=\"wri-h-load\"><span class=\"wri-step\" aria-hidden=\"true\">2<\/span>Load &amp; Sliding Distance<\/h3>\n<p class=\"wri-card-note\">Changing a unit converts the value already entered.<\/p>\n<div class=\"wri-grid\">\n<div class=\"wri-field\">\n<label class=\"wri-label\" for=\"wri-load\">Normal Load (N)<\/label>\n<div class=\"wri-row\">\n<input id=\"wri-load\" name=\"load\" type=\"text\" inputmode=\"decimal\" autocomplete=\"off\" spellcheck=\"false\" value=\"100\" aria-describedby=\"wri-load-hint wri-load-err\">\n<select id=\"wri-load-u\" name=\"loadUnit\" aria-label=\"Load unit\"><option value=\"N\" selected>N<\/option><option value=\"kN\">kN<\/option><\/select>\n<\/div>\n<span class=\"wri-hint\" id=\"wri-load-hint\">Normal force acting between the contacting surfaces.<\/span>\n<span class=\"wri-error\" id=\"wri-load-err\" role=\"alert\"><\/span>\n<\/div>\n<div class=\"wri-field\">\n<label class=\"wri-label\" for=\"wri-dist\">Sliding Distance (m)<\/label>\n<div class=\"wri-row\">\n<input id=\"wri-dist\" name=\"distance\" type=\"text\" inputmode=\"decimal\" autocomplete=\"off\" spellcheck=\"false\" value=\"1\" aria-describedby=\"wri-dist-hint wri-dist-err\">\n<select id=\"wri-dist-u\" name=\"distanceUnit\" aria-label=\"Distance unit\"><option value=\"mm\">mm<\/option><option value=\"m\">m<\/option><option value=\"km\" selected>km<\/option><\/select>\n<\/div>\n<span class=\"wri-hint\" id=\"wri-dist-hint\">Total relative sliding distance.<\/span>\n<span class=\"wri-error\" id=\"wri-dist-err\" role=\"alert\"><\/span>\n<\/div>\n<div class=\"wri-field wri-span\">\n<label class=\"wri-label\" for=\"wri-area\">Nominal Contact Area (mm&#178;) <span class=\"wri-opt\">&#8212; optional<\/span><\/label>\n<input id=\"wri-area\" name=\"area\" type=\"text\" inputmode=\"decimal\" autocomplete=\"off\" spellcheck=\"false\" placeholder=\"e.g. 50\" aria-describedby=\"wri-area-hint wri-area-err\">\n<span class=\"wri-hint\" id=\"wri-area-hint\">Used only for average contact pressure and mean wear depth. Not required by the basic Archard equation.<\/span>\n<span class=\"wri-error\" id=\"wri-area-err\" role=\"alert\"><\/span>\n<\/div>\n<\/div>\n<\/section>\n<section class=\"wri-card\" aria-labelledby=\"wri-h-op\">\n<h3 class=\"wri-card-title\" id=\"wri-h-op\"><span class=\"wri-step\" aria-hidden=\"true\">3<\/span>Operating Conditions <span class=\"wri-opt\" style=\"font-size:.85rem\">(context)<\/span><\/h3>\n<p class=\"wri-card-note\">These selections document the operating context. They do not change K &#8212; the coefficient you enter must already reflect them.<\/p>\n<div class=\"wri-grid\">\n<div class=\"wri-field\">\n<label class=\"wri-label\" for=\"wri-lub\">Lubrication Condition<\/label>\n<select id=\"wri-lub\" name=\"lubrication\"><option value=\"dry\" selected>Dry Contact<\/option><option value=\"boundary\">Boundary Lubrication<\/option><option value=\"mixed\">Mixed Lubrication<\/option><option value=\"full\">Full-Film Lubrication<\/option><\/select>\n<\/div>\n<div class=\"wri-field\">\n<label class=\"wri-label\" for=\"wri-cf\">Contact Material (counterface)<\/label>\n<select id=\"wri-cf\" name=\"counterface\"><option value=\"Steel\" selected>Steel<\/option><option value=\"Stainless Steel\">Stainless Steel<\/option><option value=\"Cast Iron\">Cast Iron<\/option><option value=\"Aluminum Alloy\">Aluminum Alloy<\/option><option value=\"Bronze\">Bronze<\/option><option value=\"Ceramic\">Ceramic<\/option><option value=\"custom\">Custom<\/option><\/select>\n<\/div>\n<div class=\"wri-field wri-span wri-hide\" id=\"wri-cf-wrap\" hidden>\n<label class=\"wri-label\" for=\"wri-cf-name\">Custom counterface name<\/label>\n<input id=\"wri-cf-name\" name=\"counterfaceName\" type=\"text\" autocomplete=\"off\" placeholder=\"e.g. WC-Co, PEEK, hardened 52100\">\n<\/div>\n<\/div>\n<\/section>\n<section class=\"wri-card\" aria-labelledby=\"wri-h-ref\">\n<h3 class=\"wri-card-title\" id=\"wri-h-ref\"><span class=\"wri-step\" aria-hidden=\"true\">4<\/span>Reference Material <span class=\"wri-opt\" style=\"font-size:.85rem\">(optional)<\/span><\/h3>\n<p class=\"wri-card-note\">The reference is evaluated under the same load and sliding distance. It defines the baseline for the relative index.<\/p>\n<label class=\"wri-check\" for=\"wri-ref-on\"><input type=\"checkbox\" id=\"wri-ref-on\" name=\"referenceOn\" checked><span class=\"wri-check-strong\">Compare with a reference material<\/span><\/label>\n<div class=\"wri-subpanel\" id=\"wri-ref-panel\">\n<div class=\"wri-grid\">\n<div class=\"wri-field wri-span\">\n<label class=\"wri-label\" for=\"wri-ref-ex\">Load example reference values <span class=\"wri-opt\">&#8212; hypothetical<\/span><\/label>\n<select id=\"wri-ref-ex\" name=\"referenceExample\">\n<option value=\"\" selected>Choose an example&#8230;<\/option>\n<option value=\"carbon\">Carbon Steel (example)<\/option>\n<option value=\"alloy\">Alloy Steel (example)<\/option>\n<option value=\"stainless\">Stainless Steel (example)<\/option>\n<option value=\"tool\">Tool Steel (example)<\/option>\n<option value=\"castiron\">Cast Iron (example)<\/option>\n<option value=\"aluminum\">Aluminum Alloy (example)<\/option>\n<option value=\"copper\">Copper Alloy (example)<\/option>\n<option value=\"titanium\">Titanium Alloy (example)<\/option>\n<\/select>\n<span class=\"wri-hint\" id=\"wri-ref-status\" aria-live=\"polite\"><\/span>\n<\/div>\n<div class=\"wri-field wri-span\">\n<label class=\"wri-label\" for=\"wri-ref-name\">Reference Material Name<\/label>\n<input id=\"wri-ref-name\" name=\"referenceName\" type=\"text\" autocomplete=\"off\" value=\"Carbon Steel (example)\">\n<\/div>\n<div class=\"wri-field\">\n<label class=\"wri-label\" for=\"wri-ref-hv\">Reference Hardness (HV)<\/label>\n<input id=\"wri-ref-hv\" name=\"referenceHV\" type=\"text\" inputmode=\"decimal\" autocomplete=\"off\" spellcheck=\"false\" value=\"200\" aria-describedby=\"wri-ref-hv-err\">\n<span class=\"wri-error\" id=\"wri-ref-hv-err\" role=\"alert\"><\/span>\n<\/div>\n<div class=\"wri-field\">\n<label class=\"wri-label\" for=\"wri-ref-k\">Reference Wear Coefficient (K)<\/label>\n<input id=\"wri-ref-k\" name=\"referenceK\" type=\"text\" inputmode=\"text\" autocomplete=\"off\" spellcheck=\"false\" value=\"1e-4\" aria-describedby=\"wri-ref-k-err\">\n<span class=\"wri-error\" id=\"wri-ref-k-err\" role=\"alert\"><\/span>\n<\/div>\n<\/div>\n<\/div>\n<\/section>\n<div class=\"wri-actions\">\n<button type=\"button\" class=\"wri-btn wri-btn-primary\" id=\"wri-calc\">Calculate<\/button>\n<\/div>\n<p class=\"wri-form-msg\" id=\"wri-form-msg\" role=\"alert\"><\/p>\n<\/div>\n<div class=\"wri-col\">\n<section class=\"wri-card wri-results wri-hide\" id=\"wri-results\" aria-labelledby=\"wri-h-res\" tabindex=\"-1\" hidden>\n<div class=\"wri-results-head\">\n<h3 class=\"wri-card-title\" id=\"wri-h-res\">Calculation Results<\/h3>\n<span class=\"wri-badge wri-badge-info\" id=\"wri-r-badge\">&#8212;<\/span>\n<\/div>\n<p class=\"wri-r-msg\" id=\"wri-r-msg\" role=\"status\"><\/p>\n<div id=\"wri-r-body\" aria-live=\"polite\">\n<div class=\"wri-main\">\n<div class=\"wri-main-label\">Estimated Wear Volume<\/div>\n<div class=\"wri-main-value\" id=\"wri-r-v\">&#8212;<\/div>\n<div class=\"wri-main-sub\" id=\"wri-r-v-sub\"><\/div>\n<\/div>\n<div class=\"wri-kpis\">\n<div class=\"wri-kpi\"><div class=\"wri-kpi-label\">Specific Wear Volume<\/div><div class=\"wri-kpi-value\" id=\"wri-r-sv\">&#8212;<\/div><div class=\"wri-kpi-sub\">V \/ L, per metre of sliding<\/div><\/div>\n<div class=\"wri-kpi\"><div class=\"wri-kpi-label\">Specific Wear Rate k<\/div><div class=\"wri-kpi-value\" id=\"wri-r-k\">&#8212;<\/div><div class=\"wri-kpi-sub\">V \/ (F &#183; L) = K \/ H<\/div><\/div>\n<div class=\"wri-kpi\"><div class=\"wri-kpi-label\">Hardness as Pressure H<\/div><div class=\"wri-kpi-value\" id=\"wri-r-h\">&#8212;<\/div><div class=\"wri-kpi-sub\" id=\"wri-r-h-sub\"><\/div><\/div>\n<div class=\"wri-kpi\"><div class=\"wri-kpi-label\">Average Contact Pressure<\/div><div class=\"wri-kpi-value\" id=\"wri-r-p\">&#8212;<\/div><div class=\"wri-kpi-sub\" id=\"wri-r-p-sub\"><\/div><\/div>\n<\/div>\n<div class=\"wri-index\" id=\"wri-r-index\">\n<div class=\"wri-index-top\"><span class=\"wri-main-label\">Relative Wear Resistance Index (WRI)<\/span><span class=\"wri-badge wri-badge-info\">Custom comparison metric<\/span><\/div>\n<div class=\"wri-index-value\" id=\"wri-r-wri\">&#8212;<\/div>\n<p class=\"wri-index-text\" id=\"wri-r-wri-text\"><\/p>\n<div class=\"wri-index-grid\">\n<div class=\"wri-kpi\"><div class=\"wri-kpi-label\" id=\"wri-r-vref-label\">Reference Wear Volume<\/div><div class=\"wri-kpi-value\" id=\"wri-r-vref\">&#8212;<\/div><\/div>\n<div class=\"wri-kpi\"><div class=\"wri-kpi-label\" id=\"wri-r-red-label\">Wear Reduction<\/div><div class=\"wri-kpi-value\" id=\"wri-r-red\">&#8212;<\/div><div class=\"wri-kpi-sub\">(V<sub>ref<\/sub> &#8722; V) \/ V<sub>ref<\/sub> &#215; 100<\/div><\/div>\n<\/div>\n<\/div>\n<div class=\"wri-noref wri-hide\" id=\"wri-r-noref\" hidden>No reference material is defined, so no relative index is calculated. Enable the reference panel to compare two materials under the same load and sliding distance.<\/div>\n<\/div>\n<\/section>\n<\/div>\n<\/div>\n<\/form>\n<div class=\"wri-toast\" id=\"wri-toast\" role=\"status\" aria-live=\"polite\"><\/div>\n<script>\n(function () {\n  \"use strict\";\n  var roots = document.querySelectorAll(\".wri-root\");\n  for (var ri = 0; ri < roots.length; ri++) {\n    if (roots[ri].getAttribute(\"data-wri-init\") !== \"1\") { init(roots[ri]); }\n  }\n  function init(root) {\n    root.setAttribute(\"data-wri-init\", \"1\");\n    \/* ===== Unique IDs so several calculators can share one page ===== *\/\n    var n = window.wriInstanceCount || 0;\n    window.wriInstanceCount = n + 1;\n    var sfx = n === 0 ? \"\" : \"-\" + (n + 1);\n    if (sfx) {\n      if (root.id) { root.id = root.id + sfx; }\n      var all = root.querySelectorAll(\"*\"), attrs = [\"for\", \"aria-describedby\", \"aria-labelledby\", \"aria-controls\"];\n      for (var a = 0; a < all.length; a++) {\n        var nd = all[a];\n        if (nd.id) { nd.id = nd.id + sfx; }\n        for (var b = 0; b < attrs.length; b++) {\n          var v = nd.getAttribute(attrs[b]);\n          if (v) { nd.setAttribute(attrs[b], v.split(\/\\s+\/).map(function (t) { return t.indexOf(\"wri-\") === 0 ? t + sfx : t; }).join(\" \")); }\n        }\n      }\n    }\n    function q(id) { return root.querySelector(\"#wri-\" + id + sfx); }\n    \/* ===================== CONSTANTS ===================== *\/\n    var G = 9.80665; \/* standard gravity: 1 kgf = 9.80665 N, so HV (kgf\/mm2) x 9.80665 = N\/mm2 = MPa *\/\n    \/* Illustrative example values only - NOT verified material properties. Used in demonstration mode. *\/\n    var MATERIALS = {\n      carbon:    { name: \"Carbon Steel\",    hv: 200, k: 1e-4, e140: true },\n      alloy:     { name: \"Alloy Steel\",     hv: 300, k: 5e-5, e140: true },\n      stainless: { name: \"Stainless Steel\", hv: 200, k: 2e-4, e140: false },\n      tool:      { name: \"Tool Steel\",      hv: 700, k: 1e-5, e140: true },\n      castiron:  { name: \"Cast Iron\",       hv: 220, k: 5e-5, e140: false },\n      aluminum:  { name: \"Aluminum Alloy\",  hv: 100, k: 5e-4, e140: false },\n      copper:    { name: \"Copper Alloy\",    hv: 150, k: 3e-4, e140: false },\n      titanium:  { name: \"Titanium Alloy\",  hv: 330, k: 5e-4, e140: false },\n      custom:    { name: \"Custom Material\", hv: null, k: null, e140: false }\n    };\n    \/* Approximate hardness conversions for non-austenitic steels after ASTM E140 Table 1: [HRC, HV, HBW 10\/3000] *\/\n    var CONV_C = [\n      [20,238,226],[21,243,231],[22,248,237],[23,254,243],[24,260,247],[25,266,253],[26,272,258],[27,279,264],\n      [28,286,271],[29,294,279],[30,302,286],[31,310,294],[32,318,301],[33,327,311],[34,336,319],[35,345,327],\n      [36,354,336],[37,363,344],[38,372,353],[39,382,362],[40,392,371],[41,402,381],[42,412,390],[43,423,400],\n      [44,434,409],[45,446,421],[46,458,432],[47,471,443],[48,484,455],[49,498,469],[50,513,481],[51,528,496],\n      [52,544,512],[53,560,525],[54,577,543],[55,595,560],[56,613,577],[57,633,595],[58,653,615],[59,674,634],\n      [60,697,654],[61,720,670],[62,746,688],[63,772,706],[64,800,722],[65,832,739],[66,865,null],[67,900,null],[68,940,null]\n    ];\n    var HRC_HV = CONV_C.map(function (r) { return [r[0], r[1]]; });\n    var HBW_HV = CONV_C.filter(function (r) { return r[2] !== null; }).map(function (r) { return [r[2], r[1]]; });\n    var LUB = {\n      dry: { name: \"Dry Contact\", warn: false, text: \"Dry contact: unlubricated K values are usually the highest and most scattered. Use a coefficient measured without lubricant for this material pair.\" },\n      boundary: { name: \"Boundary Lubrication\", warn: false, text: \"Boundary lubrication: wear is governed by surface films and additives. Use a K measured under boundary-lubricated conditions; dry-contact K values would overestimate wear.\" },\n      mixed: { name: \"Mixed Lubrication\", warn: false, text: \"Mixed lubrication: load is shared between the fluid film and asperity contacts, so K can change strongly with speed, viscosity and roughness. Use a K measured in the same regime.\" },\n      full: { name: \"Full-Film Lubrication\", warn: true, text: \"Full-film lubrication: the surfaces are separated by the lubricant, so steady sliding wear is very low and occurs mainly during start-up, shut-down, overload or contamination. Archard's model is generally not a good description of this regime.\" }\n    };\n    \/* ===================== ENGINE (pure functions) ===================== *\/\n    \/* Hardness to pressure: H [MPa] = HV x 9.80665 *\/\n    function hvToMPa(hv) { return hv * G; }\n    \/* Load to newtons: kN x 1000 *\/\n    function loadToN(v, unit) { return unit === \"kN\" ? v * 1000 : v; }\n    function nToUnit(v, unit) { return unit === \"kN\" ? v \/ 1000 : v; }\n    \/* Sliding distance to metres: mm \/ 1000, km x 1000 *\/\n    function distToM(v, unit) { return unit === \"mm\" ? v \/ 1000 : (unit === \"km\" ? v * 1000 : v); }\n    function mToUnit(v, unit) { return unit === \"mm\" ? v * 1000 : (unit === \"km\" ? v \/ 1000 : v); }\n    \/* Archard: V [mm3] = K x F [N] x L [mm] \/ H [N\/mm2] *\/\n    function archardVolume(K, F, Lmm, H) { return K * F * Lmm \/ H; }\n    \/* Specific wear volume [mm3\/m] = V \/ L[m] *\/\n    function specificWearVolume(V, Lm) { return V \/ Lm; }\n    \/* Specific (dimensional) wear rate [mm3\/(N m)] = K \/ H [mm2\/N] x 1000 [mm\/m] *\/\n    function specificWearRate(K, H) { return K \/ H * 1000; }\n    \/* Average nominal contact pressure [MPa] = F [N] \/ A [mm2] *\/\n    function contactPressure(F, A) { return F \/ A; }\n    \/* Relative index: WRI = Vref \/ V = (Kref\/Href) \/ (K\/H) because F and L are identical *\/\n    function relativeIndex(kRef, kMat) { return kMat === 0 ? null : kRef \/ kMat; }\n    \/* Wear change [%] = (Vref - V) \/ Vref x 100 *\/\n    function wearReduction(kRef, kMat) { return kRef === 0 ? null : (kRef - kMat) \/ kRef * 100; }\n    function interp(table, x) {\n      var last = table.length - 1;\n      if (x < table[0][0] || x > table[last][0]) { return null; }\n      for (var i = 0; i < last; i++) {\n        var p = table[i], r = table[i + 1];\n        if (x <= r[0]) { return p[1] + (r[1] - p[1]) * (x - p[0]) \/ (r[0] - p[0]); }\n      }\n      return table[last][1];\n    }\n    function compute(inp) {\n      var r = {};\n      r.H = hvToMPa(inp.hv);\n      r.Lmm = inp.Lm * 1000;\n      r.V = archardVolume(inp.K, inp.F, r.Lmm, r.H);\n      r.sv = specificWearVolume(r.V, inp.Lm);\n      r.k = specificWearRate(inp.K, r.H);\n      r.P = inp.A === null ? null : contactPressure(inp.F, inp.A);\n      r.depth = inp.A === null ? null : r.V \/ inp.A;\n      r.PH = r.P === null ? null : r.P \/ r.H;\n      if (inp.refOn) {\n        r.Href = hvToMPa(inp.refHV);\n        r.Vref = archardVolume(inp.refK, inp.F, r.Lmm, r.Href);\n        r.kref = specificWearRate(inp.refK, r.Href);\n        r.wri = relativeIndex(r.kref, r.k);\n        r.red = wearReduction(r.kref, r.k);\n      }\n      return r;\n    }\n    root.wriEngine = { compute: compute, archardVolume: archardVolume, hvToMPa: hvToMPa, interp: interp, HRC_HV: HRC_HV, HBW_HV: HBW_HV };\n    \/* ===================== FORMATTING ===================== *\/\n    var SUP = { \"0\": \"\u2070\", \"1\": \"\u00b9\", \"2\": \"\u00b2\", \"3\": \"\u00b3\", \"4\": \"\u2074\", \"5\": \"\u2075\", \"6\": \"\u2076\", \"7\": \"\u2077\", \"8\": \"\u2078\", \"9\": \"\u2079\", \"-\": \"\u207b\" };\n    function sciStr(expStr) {\n      var parts = expStr.split(\"e\"), e = parts[1].replace(\"+\", \"\"), s = \"\";\n      for (var i = 0; i < e.length; i++) { s += SUP[e.charAt(i)] || \"\"; }\n      return parts[0] + \" \u00d7 10\" + s;\n    }\n    \/* Results: 3 significant figures, scientific notation for very small or large values *\/\n    function sig(v, digits) {\n      if (v === null || v === undefined || !isFinite(v)) { return \"\u2014\"; }\n      if (v === 0) { return \"0\"; }\n      var d = digits || 3, abs = Math.abs(v);\n      if (abs < 1e-3 || abs >= 1e6) { return sciStr(v.toExponential(d - 1)); }\n      return v.toLocaleString(\"en-US\", { minimumSignificantDigits: d, maximumSignificantDigits: d });\n    }\n    \/* Echo of user inputs: up to 6 significant figures, no padding *\/\n    function echo(v) {\n      if (v === null || v === undefined || !isFinite(v)) { return \"\u2014\"; }\n      if (v === 0) { return \"0\"; }\n      var r = Number(v.toPrecision(6)), abs = Math.abs(r);\n      if (abs < 1e-3 || abs >= 1e7) { return sciStr(r.toExponential()); }\n      return r.toLocaleString(\"en-US\", { maximumFractionDigits: 6 });\n    }\n    function depthStr(mm) {\n      if (mm === null || !isFinite(mm)) { return \"\u2014\"; }\n      return mm < 1 ? sig(mm * 1000) + \" \u00b5m\" : sig(mm) + \" mm\";\n    }\n    \/* Parse plain, e-notation (1e-4) and \"1x10^-4\" \/ \"1\u00d710^-4\" input; returns null for empty, NaN for invalid *\/\n    function parseNum(str) {\n      var s = String(str === undefined ? \"\" : str).replace(\/\\s+\/g, \"\");\n      if (s === \"\") { return null; }\n      var m = s.match(\/^([+-]?(?:\\d+\\.?\\d*|\\.\\d+))[x\u00d7X*]10\\^?([+-]?\\d+)$\/);\n      if (m) { s = m[1] + \"e\" + m[2]; }\n      if (!\/^[+-]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][+-]?\\d+)?$\/.test(s)) { return NaN; }\n      var v = Number(s);\n      return isFinite(v) ? v : NaN;\n    }\n    function num(input) { return parseNum(input.value); }\n    function mk(tag, cls, text) { var e = document.createElement(tag); if (cls) { e.className = cls; } if (text !== undefined) { e.textContent = text; } return e; }\n    function clear(e) { while (e.firstChild) { e.removeChild(e.firstChild); } }\n    function setVisible(node, on) {\n      if (on) { node.classList.remove(\"wri-hide\"); node.removeAttribute(\"hidden\"); node.style.removeProperty(\"display\"); }\n      else { node.classList.add(\"wri-hide\"); node.setAttribute(\"hidden\", \"\"); node.style.setProperty(\"display\", \"none\", \"important\"); }\n    }\n    \/* ===================== ELEMENTS ===================== *\/\n    var el = {\n      form: root.querySelector(\".wri-form\"),\n      mat: q(\"mat\"), demo: q(\"demo\"), matStatus: q(\"mat-status\"),\n      hard: q(\"hard\"), hardLabel: q(\"hard-label\"), scale: q(\"scale\"), hardHint: q(\"hard-hint\"), hardErr: q(\"hard-err\"),\n      srcWrap: q(\"src-wrap\"), src: q(\"src\"), srcHint: q(\"src-hint\"), eqWrap: q(\"eq-wrap\"), eq: q(\"eq\"), eqErr: q(\"eq-err\"),\n      k: q(\"k\"), kErr: q(\"k-err\"),\n      load: q(\"load\"), loadU: q(\"load-u\"), loadHint: q(\"load-hint\"), loadErr: q(\"load-err\"),\n      dist: q(\"dist\"), distU: q(\"dist-u\"), distHint: q(\"dist-hint\"), distErr: q(\"dist-err\"),\n      area: q(\"area\"), areaErr: q(\"area-err\"),\n      lub: q(\"lub\"), cf: q(\"cf\"), cfWrap: q(\"cf-wrap\"), cfName: q(\"cf-name\"),\n      refOn: q(\"ref-on\"), refPanel: q(\"ref-panel\"), refEx: q(\"ref-ex\"), refStatus: q(\"ref-status\"), refName: q(\"ref-name\"),\n      refHV: q(\"ref-hv\"), refHVErr: q(\"ref-hv-err\"), refK: q(\"ref-k\"), refKErr: q(\"ref-k-err\"),\n      calc: q(\"calc\"), formMsg: q(\"form-msg\"),\n      results: q(\"results\"), badge: q(\"r-badge\"), rMsg: q(\"r-msg\"), rBody: q(\"r-body\"),\n      rV: q(\"r-v\"), rVSub: q(\"r-v-sub\"), rSV: q(\"r-sv\"), rK: q(\"r-k\"), rH: q(\"r-h\"), rHSub: q(\"r-h-sub\"), rP: q(\"r-p\"), rPSub: q(\"r-p-sub\"),\n      rIndex: q(\"r-index\"), rWri: q(\"r-wri\"), rWriText: q(\"r-wri-text\"), rVref: q(\"r-vref\"), rVrefLabel: q(\"r-vref-label\"), rRed: q(\"r-red\"), rRedLabel: q(\"r-red-label\"),\n      rNoref: q(\"r-noref\"),\n      toast: q(\"toast\")\n    };\n    var state = { matExample: true, refExample: true, valid: false, shown: false };\n    \/* ===================== UI STATE ===================== *\/\n    function matStatusText() {\n      el.matStatus.textContent = state.matExample\n        ? \"Hardness and K are hypothetical example values for demonstration only \u2014 replace them with verified data for your material.\"\n        : \"Using your own hardness and wear coefficient values.\";\n    }\n    function refStatusText() {\n      el.refStatus.textContent = state.refExample\n        ? \"Reference values are hypothetical examples \u2014 replace them with verified data.\"\n        : \"\";\n    }\n    function applyScaleUI() {\n      var scale = el.scale.value, mat = MATERIALS[el.mat.value], isHV = scale === \"HV\";\n      var e140Opt = el.src.querySelector('option[value=\"e140\"]');\n      e140Opt.disabled = !mat.e140;\n      if (el.src.value === \"e140\") { if (!mat.e140) { el.src.value = \"own\"; } }\n      setVisible(el.srcWrap, !isHV);\n      setVisible(el.eqWrap, isHV ? false : el.src.value === \"own\");\n      el.hardLabel.textContent = isHV ? \"Material Hardness (HV)\" : (scale === \"HRC\" ? \"Material Hardness (HRC)\" : \"Material Hardness (HB \/ HBW)\");\n      el.hard.placeholder = isHV ? \"e.g. 300\" : (scale === \"HRC\" ? \"e.g. 45\" : \"e.g. 250\");\n      el.srcHint.textContent = mat.e140\n        ? \"ASTM E140 Table 1 applies only to non-austenitic steels and is approximate. No universal factor is applied between hardness scales.\"\n        : \"The embedded ASTM E140 steel table is not valid for this material. Enter the HV value from a verified, material-specific table.\";\n    }\n    function fillExample(key) {\n      var m = MATERIALS[key];\n      if (m.hv === null) { return false; }\n      el.scale.value = \"HV\";\n      el.hard.value = String(m.hv);\n      el.k.value = m.k.toExponential();\n      el.eq.value = \"\";\n      state.matExample = true;\n      return true;\n    }\n    function onMaterialChange() {\n      var key = el.mat.value;\n      if (el.demo.checked) {\n        if (!fillExample(key)) { state.matExample = false; }\n      }\n      if (key === \"custom\") { state.matExample = false; }\n      if (el.scale.value !== \"HV\") { el.src.value = MATERIALS[key].e140 ? el.src.value : \"own\"; }\n      applyScaleUI(); matStatusText(); update(false);\n    }\n    function onScaleChange() {\n      var mat = MATERIALS[el.mat.value];\n      el.hard.value = \"\";\n      el.eq.value = \"\";\n      if (el.scale.value !== \"HV\") { el.src.value = mat.e140 ? \"e140\" : \"own\"; }\n      state.matExample = false;\n      applyScaleUI(); matStatusText(); update(false);\n      try { el.hard.focus(); } catch (e) { \/* ignore *\/ }\n    }\n    \/* ===================== VALIDATION ===================== *\/\n    var BADNUM = \"Enter a valid number (for example 250, 0.5 or 1e-4).\";\n    function setErr(input, errEl, msg) {\n      errEl.textContent = msg || \"\";\n      if (msg) { input.classList.add(\"wri-invalid\"); input.setAttribute(\"aria-invalid\", \"true\"); }\n      else { input.classList.remove(\"wri-invalid\"); input.removeAttribute(\"aria-invalid\"); }\n      return !msg;\n    }\n    \/* rule: \"pos\" (> 0), \"nonneg\" (>= 0); optional: empty allowed *\/\n    function checkNum(input, errEl, label, rule, optional) {\n      var v = num(input), msg = \"\";\n      if (v === null) { msg = optional ? \"\" : \"Enter the \" + label + \".\"; }\n      else if (isNaN(v)) { msg = BADNUM; }\n      else if (rule === \"pos\") { if (v <= 0) { msg = cap(label) + \" must be greater than zero.\"; } }\n      else if (v < 0) { msg = cap(label) + \" cannot be negative.\"; }\n      setErr(input, errEl, msg);\n      return { ok: !msg, v: msg ? null : v };\n    }\n    function cap(s) { return s.charAt(0).toUpperCase() + s.slice(1); }\n    function collect() {\n      var ok = true, inp = {};\n      var mat = MATERIALS[el.mat.value];\n      inp.matKey = el.mat.value; inp.matName = mat.name;\n      inp.scale = el.scale.value; inp.src = el.src.value;\n      \/* ---- hardness ---- *\/\n      var h = checkNum(el.hard, el.hardErr, \"material hardness\", \"pos\", false);\n      inp.hardVal = h.v; inp.hv = null; inp.hvNote = \"\";\n      if (!h.ok) { ok = false; setErr(el.eq, el.eqErr, \"\"); }\n      else if (inp.scale === \"HV\") { inp.hv = h.v; setErr(el.eq, el.eqErr, \"\"); }\n      else if (inp.src === \"e140\") {\n        setErr(el.eq, el.eqErr, \"\");\n        inp.hv = interp(inp.scale === \"HRC\" ? HRC_HV : HBW_HV, h.v);\n        if (inp.hv === null) {\n          ok = false;\n          setErr(el.hard, el.hardErr, inp.scale === \"HRC\"\n            ? \"Outside the embedded ASTM E140 Table 1 range (20\u201368 HRC). Enter an equivalent HV from your own verified table instead.\"\n            : \"Outside the embedded ASTM E140 Table 1 range (226\u2013739 HBW). Enter an equivalent HV from your own verified table instead.\");\n        } else {\n          inp.hvNote = echo(h.v) + \" \" + inp.scale + \" \u2248 \" + sig(inp.hv) + \" HV (ASTM E140 Table 1, non-austenitic steels, approximate)\";\n        }\n      } else {\n        var eq = checkNum(el.eq, el.eqErr, \"equivalent HV from your conversion table\", \"pos\", false);\n        if (!eq.ok) { ok = false; } else { inp.hv = eq.v; inp.hvNote = echo(h.v) + \" \" + inp.scale + \" = \" + echo(eq.v) + \" HV (from user-supplied conversion table)\"; }\n      }\n      \/* ---- wear coefficient ---- *\/\n      var k = checkNum(el.k, el.kErr, \"wear coefficient K\", \"nonneg\", false);\n      if (!k.ok) { ok = false; } inp.K = k.v;\n      \/* ---- load ---- *\/\n      var f = checkNum(el.load, el.loadErr, \"normal load\", \"nonneg\", false);\n      if (!f.ok) { ok = false; } inp.Fin = f.v; inp.Fu = el.loadU.value; inp.F = f.ok ? loadToN(f.v, inp.Fu) : null;\n      \/* ---- distance ---- *\/\n      var d = checkNum(el.dist, el.distErr, \"sliding distance\", \"pos\", false);\n      if (!d.ok) { ok = false; } inp.Lin = d.v; inp.Lu = el.distU.value; inp.Lm = d.ok ? distToM(d.v, inp.Lu) : null;\n      \/* ---- contact area (optional) ---- *\/\n      var ar = checkNum(el.area, el.areaErr, \"contact area\", \"pos\", true);\n      if (!ar.ok) { ok = false; } inp.A = ar.v;\n      \/* ---- context ---- *\/\n      inp.lub = el.lub.value;\n      inp.cf = el.cf.value === \"custom\" ? (el.cfName.value.trim() || \"Custom counterface\") : el.cf.value;\n      \/* ---- reference ---- *\/\n      inp.refOn = el.refOn.checked;\n      if (inp.refOn) {\n        inp.refName = el.refName.value.trim() || \"Reference material\";\n        var rh = checkNum(el.refHV, el.refHVErr, \"reference hardness\", \"pos\", false);\n        var rk = checkNum(el.refK, el.refKErr, \"reference wear coefficient\", \"nonneg\", false);\n        if (!rh.ok) { ok = false; } if (!rk.ok) { ok = false; }\n        inp.refHV = rh.v; inp.refK = rk.v;\n      } else {\n        setErr(el.refHV, el.refHVErr, \"\"); setErr(el.refK, el.refKErr, \"\");\n      }\n      return { ok: ok, inp: inp };\n    }\n    \/* ===================== HINTS ===================== *\/\n    function updateHints() {\n      var f = num(el.load), d = num(el.dist), hv = num(el.hard);\n      if (f === null || isNaN(f) || f < 0) { el.loadHint.textContent = \"Normal force acting between the contacting surfaces.\"; }\n      else { el.loadHint.textContent = el.loadU.value === \"kN\" ? \"= \" + echo(loadToN(f, \"kN\")) + \" N\" : \"Normal force acting between the contacting surfaces.\"; }\n      if (d === null || isNaN(d) || d <= 0) { el.distHint.textContent = \"Total relative sliding distance.\"; }\n      else { var m = distToM(d, el.distU.value); el.distHint.textContent = \"= \" + echo(m) + \" m = \" + echo(m * 1000) + \" mm\"; }\n      if (el.scale.value === \"HV\") {\n        el.hardHint.textContent = (hv === null || isNaN(hv) || hv <= 0) ? \"Enter the Vickers hardness of the material.\" : \"H \u2248 \" + echo(hv) + \" \u00d7 9.80665 = \" + sig(hvToMPa(hv)) + \" MPa\";\n      } else {\n        el.hardHint.textContent = \"Enter the measured \" + (el.scale.value === \"HRC\" ? \"Rockwell C\" : \"Brinell\") + \" value. It is converted to HV before use.\";\n      }\n    }\n    \/* ===================== RENDER ===================== *\/\n    function setValue(node, value, unit) {\n      clear(node); node.appendChild(document.createTextNode(value));\n      if (unit) { node.appendChild(mk(\"span\", \"wri-unit\", unit)); }\n    }\n    function showInvalid(msg) {\n      state.valid = false;\n      el.rMsg.textContent = msg;\n      el.rBody.classList.add(\"wri-dim\");\n      el.badge.className = \"wri-badge wri-badge-warn\"; el.badge.textContent = \"Check inputs\";\n    }\n    function render(inp, r) {\n      el.rMsg.textContent = \"\"; el.rBody.classList.remove(\"wri-dim\");\n      var demo = state.matExample || (inp.refOn ? state.refExample : false);\n      el.badge.className = \"wri-badge \" + (demo ? \"wri-badge-warn\" : \"wri-badge-ok\");\n      el.badge.textContent = demo ? \"Demonstration values\" : \"Your inputs\";\n      \/* ---- main values ---- *\/\n      setValue(el.rV, sig(r.V), \"mm\u00b3\");\n      el.rVSub.textContent = inp.matName + \" \u00b7 \" + echo(inp.F) + \" N \u00b7 \" + echo(inp.Lm) + \" m sliding\";\n      setValue(el.rSV, sig(r.sv), \"mm\u00b3\/m\");\n      setValue(el.rK, sig(r.k), \"mm\u00b3\/(N\u00b7m)\");\n      setValue(el.rH, sig(r.H), \"MPa\");\n      el.rHSub.textContent = inp.scale === \"HV\" ? \"from \" + echo(inp.hv) + \" HV\" : (inp.src === \"e140\" ? \"from \u2248 \" + sig(inp.hv) + \" HV (\" + echo(inp.hardVal) + \" \" + inp.scale + \", ASTM E140)\" : \"from \" + echo(inp.hv) + \" HV (\" + echo(inp.hardVal) + \" \" + inp.scale + \", your table)\");\n      if (r.P === null) { setValue(el.rP, \"\u2014\"); el.rPSub.textContent = \"Enter a contact area to calculate\"; }\n      else { setValue(el.rP, sig(r.P), \"MPa\"); el.rPSub.textContent = \"P\/H = \" + sig(r.PH) + \" \u00b7 mean wear depth \" + depthStr(r.depth); }\n      \/* ---- relative index ---- *\/\n      setVisible(el.rIndex, inp.refOn); setVisible(el.rNoref, !inp.refOn);\n      var wriTxt = \"\", redTxt = \"\u2014\", redLabel = \"Wear Reduction\";\n      if (inp.refOn) {\n        setValue(el.rVref, sig(r.Vref), \"mm\u00b3\");\n        el.rVrefLabel.textContent = \"Reference Wear Volume\";\n        if (r.wri === null) {\n          setValue(el.rWri, \"Not defined\");\n          wriTxt = \"The evaluated material has K = 0, so its estimated wear volume is zero and the ratio cannot be formed.\";\n        } else if (r.wri === 0) {\n          setValue(el.rWri, \"0\");\n          wriTxt = \"The reference has K = 0 (zero estimated wear), so the index is not meaningful. Enter a positive reference K.\";\n        } else {\n          setValue(el.rWri, sig(r.wri));\n          var w3 = Number(r.wri.toPrecision(3));\n          if (w3 === 1) { wriTxt = \"Same estimated wear resistance as \" + inp.refName + \".\"; }\n          else if (r.wri > 1) { wriTxt = \"Lower estimated wear volume than \" + inp.refName + \": about \" + sig(r.wri) + \"\u00d7 less material loss under the same load and sliding distance.\"; }\n          else { wriTxt = \"Higher estimated wear volume than \" + inp.refName + \": about \" + sig(1 \/ r.wri) + \"\u00d7 more material loss under the same load and sliding distance.\"; }\n        }\n        if (r.red !== null) {\n          if (r.red >= 0) { redTxt = sig(r.red) + \"%\"; redLabel = \"Wear Reduction\"; }\n          else { redTxt = \"+\" + sig(-r.red) + \"%\"; redLabel = \"Wear Increase\"; }\n        }\n        el.rWriText.textContent = wriTxt;\n        setValue(el.rRed, redTxt); el.rRedLabel.textContent = redLabel + \" vs Reference\";\n      }\n      state.valid = true;\n    }\n    function update(fromButton) {\n      updateHints();\n      var res = collect();\n      if (!res.ok) {\n        showInvalid(\"Some inputs need attention. Correct the highlighted fields to update the results.\");\n        if (fromButton) {\n          el.formMsg.textContent = \"Please correct the highlighted fields.\";\n          var first = root.querySelector(\".wri-invalid\"); if (first) { try { first.focus(); } catch (e) { \/* ignore *\/ } }\n        }\n        return;\n      }\n      el.formMsg.textContent = \"\";\n      var r = compute(res.inp);\n      if (!isFinite(r.V)) { showInvalid(\"These values cannot produce a valid result. Check hardness, load and distance.\"); return; }\n      if (fromButton) { state.shown = true; setVisible(el.results, true); }\n      if (!state.shown) { return; }\n      render(res.inp, r);\n      if (fromButton) {\n        if (el.results.scrollIntoView) { el.results.scrollIntoView({ behavior: \"smooth\", block: \"start\" }); }\n        toast(\"Results updated\");\n      }\n    }\n    \/* ===================== TOOLS ===================== *\/\n    var toastTimer = null;\n    function toast(msg) {\n      el.toast.textContent = msg; el.toast.classList.add(\"wri-show\");\n      if (toastTimer) { clearTimeout(toastTimer); }\n      toastTimer = setTimeout(function () { el.toast.classList.remove(\"wri-show\"); }, 2000);\n    }\n    \/* ===================== EVENTS ===================== *\/\n    function bindUnit(sel, input, toBase, fromBase) {\n      sel.setAttribute(\"data-prev\", sel.value);\n      sel.addEventListener(\"change\", function () {\n        var prev = sel.getAttribute(\"data-prev\") || sel.value, v = num(input);\n        if (v !== null) { if (isFinite(v)) { input.value = String(Number(fromBase(toBase(v, prev), sel.value).toPrecision(10))); } }\n        sel.setAttribute(\"data-prev\", sel.value);\n        update(false);\n      });\n    }\n    bindUnit(el.loadU, el.load, loadToN, nToUnit);\n    bindUnit(el.distU, el.dist, distToM, mToUnit);\n    el.mat.addEventListener(\"change\", onMaterialChange);\n    el.scale.addEventListener(\"change\", onScaleChange);\n    el.src.addEventListener(\"change\", function () { applyScaleUI(); update(false); });\n    el.demo.addEventListener(\"change\", function () {\n      if (el.demo.checked) { if (fillExample(el.mat.value)) { applyScaleUI(); } }\n      matStatusText(); update(false);\n    });\n    function markMatUser() { if (state.matExample) { state.matExample = false; matStatusText(); } }\n    function markRefUser() { if (state.refExample) { state.refExample = false; refStatusText(); } }\n    el.hard.addEventListener(\"input\", function () { markMatUser(); update(false); });\n    el.eq.addEventListener(\"input\", function () { markMatUser(); update(false); });\n    el.k.addEventListener(\"input\", function () { markMatUser(); update(false); });\n    var chips = root.querySelectorAll(\".wri-chip\");\n    for (var c = 0; c < chips.length; c++) {\n      chips[c].addEventListener(\"click\", function () { el.k.value = this.getAttribute(\"data-k\"); markMatUser(); update(false); });\n    }\n    [el.load, el.dist, el.area].forEach(function (inp) { inp.addEventListener(\"input\", function () { update(false); }); });\n    el.lub.addEventListener(\"change\", function () { update(false); });\n    el.cf.addEventListener(\"change\", function () { setVisible(el.cfWrap, el.cf.value === \"custom\"); update(false); });\n    el.cfName.addEventListener(\"input\", function () { update(false); });\n    el.refOn.addEventListener(\"change\", function () { setVisible(el.refPanel, el.refOn.checked); update(false); });\n    el.refEx.addEventListener(\"change\", function () {\n      var m = MATERIALS[el.refEx.value];\n      if (m) { if (m.hv !== null) {\n        el.refName.value = m.name + \" (example)\"; el.refHV.value = String(m.hv); el.refK.value = m.k.toExponential();\n        state.refExample = true; refStatusText();\n      } }\n      el.refEx.value = \"\";\n      update(false);\n    });\n    el.refName.addEventListener(\"input\", function () { update(false); });\n    el.refHV.addEventListener(\"input\", function () { markRefUser(); update(false); });\n    el.refK.addEventListener(\"input\", function () { markRefUser(); update(false); });\n    el.calc.addEventListener(\"click\", function () { update(true); });\n    el.form.addEventListener(\"submit\", function (e) { e.preventDefault(); });\n    el.form.addEventListener(\"keydown\", function (e) {\n      if (e.key === \"Enter\") { if (e.target) { if (e.target.tagName === \"INPUT\") { e.preventDefault(); update(true); } } }\n    });\n    \/* ===================== START ===================== *\/\n    setVisible(el.results, false);\n    applyScaleUI(); matStatusText(); refStatusText(); update(false);\n  }\n})();\n<\/script>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>The Wear Resistance Index Estimation Calculator is a practical online engineering tool designed to help engineers, material scientists, and manufacturing professionals estimate material wear performance&#8230;<\/p>","protected":false},"author":2,"featured_media":24954,"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_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[8647],"tags":[8751,8750,8748,8749,7800],"class_list":["post-24953","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-materials-science-and-properties","tag-archard-equation","tag-material-wear","tag-wear-index","tag-wear-rate","tag-wear-resistance","pmpro-has-access"],"acf":[],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/www.mechstream.com\/wp-content\/uploads\/2026\/10\/Wear-Resistance-Index-Estimation-Calculator.png","_links":{"self":[{"href":"https:\/\/www.mechstream.com\/fr\/wp-json\/wp\/v2\/posts\/24953","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mechstream.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mechstream.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/fr\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/fr\/wp-json\/wp\/v2\/comments?post=24953"}],"version-history":[{"count":0,"href":"https:\/\/www.mechstream.com\/fr\/wp-json\/wp\/v2\/posts\/24953\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/fr\/wp-json\/wp\/v2\/media\/24954"}],"wp:attachment":[{"href":"https:\/\/www.mechstream.com\/fr\/wp-json\/wp\/v2\/media?parent=24953"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mechstream.com\/fr\/wp-json\/wp\/v2\/categories?post=24953"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mechstream.com\/fr\/wp-json\/wp\/v2\/tags?post=24953"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}