{"id":24956,"date":"2026-10-22T03:37:04","date_gmt":"2026-10-22T03:37:04","guid":{"rendered":"https:\/\/www.mechstream.com\/?p=24956"},"modified":"2026-10-22T03:37:06","modified_gmt":"2026-10-22T03:37:06","slug":"fatigue-limit-estimation-calculator","status":"publish","type":"post","link":"https:\/\/www.mechstream.com\/fr\/fatigue-limit-estimation-calculator\/","title":{"rendered":"Fatigue Limit Estimation Calculator"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">The Fatigue Limit Estimation Calculator is a practical online engineering tool designed to help mechanical engineers, material scientists, and manufacturing professionals estimate material endurance limits and evaluate fatigue performance under cyclic loading conditions. Using ultimate tensile strength, surface finish, component size, loading type, and reliability factors, this calculator applies the Marin modification method to estimate fatigue limits for applicable materials. It also supports Goodman, Gerber, and Soderberg fatigue analysis to evaluate fatigue safety factors. Whether you&#8217;re designing shafts, gears, springs, or industrial machinery components, this easy-to-use calculator simplifies fatigue strength estimation, supports material selection, and helps improve mechanical design reliability.<\/p>\n\n\n\n<div id=\"flc-calculator\" class=\"flc-root\" data-flc-widget=\"fatigue-limit-estimation\">\n<style>\n#flc-calculator,#flc-calculator *,#flc-calculator *::before,#flc-calculator *::after{box-sizing:border-box}\n#flc-calculator{\n  --flc-bg:#f4f6f9;--flc-card:#ffffff;--flc-navy:#0f2342;--flc-text:#1c2a3e;--flc-muted:#55667c;--flc-soft:#7f8ea3;\n  --flc-line:#cdd6e1;--flc-line-soft:#e2e8f0;--flc-accent:#1d64c8;--flc-accent-dark:#154c9a;--flc-accent-soft:#e8f0fb;\n  --flc-err:#c4291c;--flc-err-soft:#fdecea;--flc-warn:#7a5200;--flc-warn-soft:#fff6e0;--flc-ok-soft:#eaf6f0;\n  --flc-goodman:#1d64c8;--flc-gerber:#0d8a6a;--flc-soderberg:#b4531a;--flc-yield:#6b7787;--flc-point:#0f2342;\n  display:block;width:100%;max-width:1040px;margin:24px auto;padding:32px;background:var(--flc-bg);color:var(--flc-text);\n  border-radius:22px;font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,\"Helvetica Neue\",Arial,sans-serif;\n  font-size:16px;line-height:1.55;font-weight:400;letter-spacing:normal;text-transform:none;text-indent:0;word-spacing:normal;-webkit-font-smoothing:antialiased;text-align:left;position:relative\n}\n#flc-calculator .flc-wrap{container-type:inline-size;container-name:flc;width:100%}\n#flc-calculator h2,#flc-calculator h3,#flc-calculator h4,#flc-calculator p,#flc-calculator ul,#flc-calculator ol,#flc-calculator li,#flc-calculator figure,#flc-calculator figcaption,#flc-calculator table,#flc-calculator details,#flc-calculator summary,#flc-calculator fieldset,#flc-calculator legend,#flc-calculator label,#flc-calculator header,#flc-calculator section,#flc-calculator article{\n  margin:0;padding:0;border:0;background:none;color:inherit;font-family:inherit;font-size:inherit;font-weight:inherit;font-style:normal;line-height:inherit;text-indent:0;text-transform:none;letter-spacing:normal;text-shadow:none;box-shadow:none;float:none;width:auto;max-width:none\n}\n#flc-calculator ul,#flc-calculator ol{list-style:none}\n#flc-calculator a{color:var(--flc-accent);text-decoration:underline}\n#flc-calculator sub,#flc-calculator sup{font-size:.72em;line-height:0;position:relative;vertical-align:baseline}\n#flc-calculator sub{bottom:-.25em}\n#flc-calculator sup{top:-.5em}\n#flc-calculator [hidden]{display:none!important}\n#flc-calculator .flc-card{background:var(--flc-card);border:1px solid var(--flc-line-soft);border-radius:18px;padding:22px;box-shadow:0 1px 2px rgba(15,35,66,.05),0 4px 14px rgba(15,35,66,.04);min-width:0}\n#flc-calculator .flc-card+.flc-card{margin-top:16px}\n#flc-calculator .flc-card-title{margin:0 0 4px;color:var(--flc-navy);font-size:17.5px;font-weight:650;line-height:1.25;display:flex;align-items:center;gap:10px}\n#flc-calculator .flc-step{display:inline-flex;align-items:center;justify-content:center;flex:0 0 24px;width:24px;height:24px;border-radius:50%;background:var(--flc-accent-soft);color:var(--flc-accent);font-size:12.8px;font-weight:700}\n#flc-calculator .flc-card-note{color:var(--flc-muted);font-size:14.1px;margin:0 0 16px}\n#flc-calculator .flc-grid{display:grid;grid-template-columns:minmax(0,1fr);gap:16px 18px}\n#flc-calculator .flc-field{min-width:0}\n#flc-calculator .flc-span{grid-column:1\/-1}\n#flc-calculator .flc-label{display:block;font-size:14.1px;font-weight:600;color:var(--flc-navy);margin:0 0 6px;line-height:1.3}\n#flc-calculator .flc-opt{color:var(--flc-soft);font-weight:400;font-size:12.8px;margin-left:4px}\n#flc-calculator .flc-hint{display:block;color:var(--flc-soft);font-size:12.7px;margin-top:5px;line-height:1.45}\n#flc-calculator .flc-hint:empty{display:none}\n#flc-calculator .flc-error{display:block;color:var(--flc-err);font-size:13px;margin-top:4px;line-height:1.4}\n#flc-calculator .flc-error:empty{display:none}\n#flc-calculator .flc-row{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:stretch}\n#flc-calculator .flc-unit{display:inline-flex;align-items:center;justify-content:center;min-width:60px;min-height:46px;padding:0 12px;border-radius:12px;background:#eef2f7;color:var(--flc-muted);font-size:14.1px;font-weight:600;white-space:nowrap}\n#flc-calculator input[type=number],#flc-calculator select{\n  -webkit-appearance:none;appearance:none;display:block;width:100%;min-height:46px;height:auto;margin:0;padding:10px 14px;font:inherit;font-size:16px;line-height:1.3;\n  color:var(--flc-text);background-color:#fff;border:1px solid var(--flc-line);border-radius:12px;box-shadow:none;outline:none;max-width:none;transition:border-color .15s ease,box-shadow .15s ease\n}\n#flc-calculator select{padding-right:36px;background-image:linear-gradient(45deg,transparent 50%,#55667c 50%),linear-gradient(135deg,#55667c 50%,transparent 50%);background-position:calc(100% - 19px) 20px,calc(100% - 14px) 20px;background-size:5px 5px,5px 5px;background-repeat:no-repeat;cursor:pointer}\n#flc-calculator input[type=number]:focus,#flc-calculator select:focus{border-color:var(--flc-accent);box-shadow:0 0 0 4px rgba(29,100,200,.18)}\n#flc-calculator input[type=number]:disabled{background:#f3f5f8;color:var(--flc-soft);cursor:not-allowed}\n#flc-calculator input[type=number]::placeholder{color:#a7b2c1;opacity:1}\n#flc-calculator .flc-invalid{border-color:var(--flc-err)!important;box-shadow:0 0 0 3px rgba(196,41,28,.12)!important}\n#flc-calculator .flc-seg{display:grid;grid-auto-columns:minmax(0,1fr);grid-auto-flow:column;min-width:0;width:100%;gap:4px;padding:4px;background:#e9eef4;border-radius:13px;border:0;margin:0;position:relative}\n#flc-calculator .flc-seg legend{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}\n#flc-calculator .flc-seg input{position:absolute;opacity:0;width:1px;height:1px;margin:0;pointer-events:none}\n#flc-calculator .flc-seg label{display:flex;align-items:center;justify-content:center;min-height:40px;padding:6px;border-radius:10px;font-size:14.1px;font-weight:600;color:var(--flc-muted);cursor:pointer;text-align:center;line-height:1.2;transition:background .15s,color .15s,box-shadow .15s;margin:0}\n#flc-calculator .flc-seg input:checked+label{background:#fff;color:var(--flc-navy);box-shadow:0 1px 3px rgba(15,35,66,.15)}\n#flc-calculator .flc-seg input:focus-visible+label{outline:3px solid rgba(29,100,200,.4);outline-offset:1px}\n#flc-calculator .flc-seg-label{display:block;font-size:14.1px;font-weight:600;color:var(--flc-navy);margin:0 0 6px}\n#flc-calculator .flc-info{padding:13px 15px;border-radius:12px;background:#f7f9fc;border:1px solid var(--flc-line-soft);font-size:13.5px;color:var(--flc-muted);line-height:1.5}\n#flc-calculator .flc-info strong{color:var(--flc-navy);font-weight:600}\n#flc-calculator .flc-info p+p{margin-top:5px}\n#flc-calculator .flc-info-warn{background:var(--flc-warn-soft);border-color:#f0dca6;color:#5c4300}\n#flc-calculator .flc-info-warn strong{color:#4a3600}\n#flc-calculator .flc-badge{display:inline-block;padding:1px 8px;border-radius:999px;font-size:10.9px;font-weight:700;letter-spacing:.03em;text-transform:uppercase;line-height:1.6;vertical-align:middle;white-space:nowrap}\n#flc-calculator .flc-b-auto{background:var(--flc-accent-soft);color:var(--flc-accent-dark)}\n#flc-calculator .flc-b-custom{background:#efe9fb;color:#5b3aa8}\n#flc-calculator .flc-b-assumed{background:var(--flc-warn-soft);color:var(--flc-warn)}\n#flc-calculator .flc-b-missing{background:var(--flc-err-soft);color:var(--flc-err)}\n#flc-calculator .flc-check{display:flex;gap:10px;align-items:flex-start;font-size:14.6px;font-weight:600;color:var(--flc-navy);cursor:pointer;line-height:1.4}\n#flc-calculator .flc-check input{flex:0 0 18px;width:18px;height:18px;margin:2px 0 0;accent-color:var(--flc-accent);cursor:pointer}\n#flc-calculator .flc-adv{margin-top:16px}\n#flc-calculator .flc-adv summary{cursor:pointer;list-style:none;display:flex;align-items:center;justify-content:space-between;gap:10px;font-size:16.3px;font-weight:650;color:var(--flc-navy)}\n#flc-calculator .flc-adv summary::-webkit-details-marker{display:none}\n#flc-calculator .flc-adv summary::after{content:\"+\";font-size:21px;font-weight:400;color:var(--flc-accent);line-height:1}\n#flc-calculator .flc-adv[open] summary::after{content:\"\\2212\"}\n#flc-calculator .flc-adv summary:focus-visible{outline:3px solid rgba(29,100,200,.4);outline-offset:4px;border-radius:6px}\n#flc-calculator .flc-adv-body{margin-top:14px}\n#flc-calculator .flc-frow{display:grid;grid-template-columns:minmax(0,1fr);gap:8px;padding:14px 0;border-top:1px solid var(--flc-line-soft)}\n#flc-calculator .flc-frow:first-of-type{border-top:0;padding-top:2px}\n#flc-calculator .flc-frow-name{font-weight:650;font-size:14.5px;color:var(--flc-navy)}\n#flc-calculator .flc-frow-auto{font-size:12.8px;color:var(--flc-muted);line-height:1.45}\n#flc-calculator .flc-frow-inputs{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:8px}\n#flc-calculator .flc-actions{display:flex;flex-wrap:wrap;gap:10px;justify-content:center;margin-top:18px}\n#flc-calculator .flc-btn{-webkit-appearance:none;appearance:none;display:inline-flex;align-items:center;justify-content:center;gap:6px;min-height:46px;min-width:140px;margin:0;padding:10px 22px;border-radius:999px;border:1px solid transparent;font:inherit;font-size:15.4px;font-weight:600;line-height:1.2;cursor:pointer;text-decoration:none;text-transform:none;letter-spacing:normal;box-shadow:none;width:auto;height:auto;transition:background .15s,border-color .15s,color .15s}\n#flc-calculator .flc-btn-primary{background:var(--flc-accent);color:#fff}\n#flc-calculator .flc-btn-primary:hover{background:var(--flc-accent-dark);color:#fff}\n#flc-calculator .flc-btn:focus-visible{outline:3px solid rgba(29,100,200,.4);outline-offset:2px}\n#flc-calculator .flc-form-msg{text-align:center;color:var(--flc-err);font-size:13.8px;margin-top:10px;min-height:1.3em}\n#flc-calculator .flc-stale{margin:0 0 12px;padding:10px 13px;border-radius:10px;background:var(--flc-warn-soft);color:#5c4300;font-size:13.3px;border:1px solid #f0dca6}\n#flc-calculator .flc-is-stale .flc-dim{opacity:.45;transition:opacity .2s}\n#flc-calculator .flc-sec{color:var(--flc-navy);font-size:15.5px;font-weight:650;margin:22px 0 10px}\n#flc-calculator .flc-hero{display:grid;grid-template-columns:minmax(0,1fr);gap:10px}\n#flc-calculator .flc-hero-card{border-radius:14px;padding:16px 18px;border:1px solid var(--flc-line-soft);background:#f7f9fc;min-width:0}\n#flc-calculator .flc-hero-card.flc-primary{background:var(--flc-accent-soft);border-color:#c9dbf3}\n#flc-calculator .flc-hero-label{font-size:13px;font-weight:600;color:var(--flc-muted);line-height:1.35}\n#flc-calculator .flc-hero-value{font-size:clamp(23px,3vw,29px);font-weight:700;color:var(--flc-navy);letter-spacing:-.01em;line-height:1.2;margin-top:4px;overflow-wrap:anywhere}\n#flc-calculator .flc-hero-value.flc-na{font-size:19px;color:var(--flc-soft)}\n#flc-calculator .flc-hero-sub{font-size:12.8px;color:var(--flc-muted);margin-top:4px;line-height:1.45;overflow-wrap:anywhere}\n#flc-calculator .flc-kpis{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}\n#flc-calculator .flc-kpi{background:#f7f9fc;border:1px solid var(--flc-line-soft);border-radius:13px;padding:12px 14px;min-width:0}\n#flc-calculator .flc-kpi-label{font-size:12.8px;font-weight:600;color:var(--flc-muted);line-height:1.3;display:flex;flex-wrap:wrap;gap:4px 6px;align-items:center}\n#flc-calculator .flc-kpi-value{font-size:clamp(18px,2.2vw,22px);font-weight:700;color:var(--flc-navy);letter-spacing:-.01em;margin-top:3px;line-height:1.25;overflow-wrap:anywhere}\n#flc-calculator .flc-kpi-value.flc-na{color:var(--flc-soft);font-size:16px}\n#flc-calculator .flc-kpi-sub{font-size:12.3px;color:var(--flc-muted);margin-top:3px;line-height:1.4;overflow-wrap:anywhere}\n#flc-calculator .flc-formula{margin-top:12px;padding:11px 14px;border-radius:11px;background:#f7f9fc;border:1px dashed var(--flc-line);font-size:13.6px;color:var(--flc-text);overflow-wrap:anywhere;line-height:1.5}\n@container flc (min-width:520px){\n  #flc-calculator .flc-grid{grid-template-columns:repeat(2,minmax(0,1fr))}\n  #flc-calculator .flc-hero{grid-template-columns:repeat(2,minmax(0,1fr))}\n  #flc-calculator .flc-frow{grid-template-columns:minmax(0,1.3fr) minmax(0,1fr);align-items:center}\n}\n@container flc (min-width:780px){\n  #flc-calculator .flc-kpis{grid-template-columns:repeat(3,minmax(0,1fr))}\n  #flc-calculator .flc-kpis.flc-kpis-4{grid-template-columns:repeat(4,minmax(0,1fr))}\n}\n@media (max-width:700px){\n  #flc-calculator{padding:18px 14px;border-radius:16px;margin:12px auto}\n  #flc-calculator .flc-card{padding:18px 15px;border-radius:16px}\n  #flc-calculator .flc-actions .flc-btn{flex:1 1 auto;min-width:0}\n  #flc-calculator .flc-seg label{font-size:13.1px;padding:6px 3px}\n}\n@media (max-width:380px){\n  #flc-calculator .flc-kpis{grid-template-columns:minmax(0,1fr)}\n}\n@media (prefers-reduced-motion:reduce){#flc-calculator *{transition:none!important}}\n@media print{#flc-calculator .flc-actions{display:none!important}}\n<\/style>\n<div class=\"flc-wrap\">\n<form class=\"flc-form\" id=\"flc-form\" novalidate onsubmit=\"return false;\">\n<section class=\"flc-card\" aria-labelledby=\"flc-h-mat\">\n<h3 class=\"flc-card-title\" id=\"flc-h-mat\"><span class=\"flc-step\" aria-hidden=\"true\">1<\/span>Material properties<\/h3>\n<p class=\"flc-card-note\">The material decides which estimation method is available. Steel correlations are not applied to other materials.<\/p>\n<span class=\"flc-seg-label\" aria-hidden=\"true\">Stress unit (inputs and results)<\/span>\n<fieldset class=\"flc-seg\">\n<legend>Stress unit<\/legend>\n<input type=\"radio\" id=\"flc-u-mpa\" name=\"flc-unit\" value=\"MPa\" checked><label for=\"flc-u-mpa\">MPa<\/label>\n<input type=\"radio\" id=\"flc-u-ksi\" name=\"flc-unit\" value=\"ksi\"><label for=\"flc-u-ksi\">ksi<\/label>\n<\/fieldset>\n<span class=\"flc-hint\">1 ksi = 6.894757 MPa. Switching converts the values already entered.<\/span>\n<div class=\"flc-grid\" style=\"margin-top:16px\">\n<div class=\"flc-field flc-span\">\n<label class=\"flc-label\" for=\"flc-material\">Material type<\/label>\n<select id=\"flc-material\" name=\"material\">\n<option value=\"carbon\" selected>Carbon Steel<\/option>\n<option value=\"alloy\">Alloy Steel<\/option>\n<option value=\"stainless\">Stainless Steel<\/option>\n<option value=\"castiron\">Cast Iron<\/option>\n<option value=\"aluminum\">Aluminum Alloy<\/option>\n<option value=\"titanium\">Titanium Alloy<\/option>\n<option value=\"custom\">Custom Material<\/option>\n<\/select>\n<\/div>\n<div class=\"flc-info flc-span\" id=\"flc-mat-info\" aria-live=\"polite\"><\/div>\n<div class=\"flc-field\">\n<label class=\"flc-label\" for=\"flc-sut\">Ultimate Tensile Strength (S<sub>ut<\/sub>)<\/label>\n<div class=\"flc-row\"><input id=\"flc-sut\" name=\"sut\" type=\"number\" inputmode=\"decimal\" step=\"any\" min=\"0\" aria-describedby=\"flc-sut-hint flc-sut-err\"><span class=\"flc-unit flc-ulabel\" aria-hidden=\"true\">MPa<\/span><\/div>\n<span class=\"flc-hint\" id=\"flc-sut-hint\">Minimum or certified value for your material and heat treatment.<\/span>\n<span class=\"flc-error\" id=\"flc-sut-err\" aria-live=\"polite\"><\/span>\n<\/div>\n<div class=\"flc-field\">\n<label class=\"flc-label\" for=\"flc-sy\">Yield Strength (S<sub>y<\/sub>) <span class=\"flc-opt\">(optional)<\/span><\/label>\n<div class=\"flc-row\"><input id=\"flc-sy\" name=\"sy\" type=\"number\" inputmode=\"decimal\" step=\"any\" min=\"0\" aria-describedby=\"flc-sy-hint flc-sy-err\"><span class=\"flc-unit flc-ulabel\" aria-hidden=\"true\">MPa<\/span><\/div>\n<span class=\"flc-hint\" id=\"flc-sy-hint\">Required for Soderberg analysis and the static yielding check; optional for Goodman and Gerber.<\/span>\n<span class=\"flc-error\" id=\"flc-sy-err\" aria-live=\"polite\"><\/span>\n<\/div>\n<div class=\"flc-field flc-span\" id=\"flc-source-field\">\n<label class=\"flc-label\" for=\"flc-source\">Unmodified endurance limit source<\/label>\n<select id=\"flc-source\" name=\"source\" aria-describedby=\"flc-source-hint\">\n<option value=\"estimate\" selected>Estimate from Sut (steel correlation)<\/option>\n<option value=\"data\">Enter fatigue test data<\/option>\n<\/select>\n<span class=\"flc-hint\" id=\"flc-source-hint\"><\/span>\n<\/div>\n<div class=\"flc-field\" id=\"flc-sf-field\" hidden>\n<label class=\"flc-label\" for=\"flc-sf\" id=\"flc-sf-label\">Reference fatigue strength S&#8242;<sub>f<\/sub><\/label>\n<div class=\"flc-row\"><input id=\"flc-sf\" name=\"sf\" type=\"number\" inputmode=\"decimal\" step=\"any\" min=\"0\" aria-describedby=\"flc-sf-hint flc-sf-err\"><span class=\"flc-unit flc-ulabel\" aria-hidden=\"true\">MPa<\/span><\/div>\n<span class=\"flc-hint\" id=\"flc-sf-hint\">Fully reversed fatigue strength of polished rotating-beam specimens (unmodified), from tests or the material standard.<\/span>\n<span class=\"flc-error\" id=\"flc-sf-err\" aria-live=\"polite\"><\/span>\n<\/div>\n<div class=\"flc-field\" id=\"flc-n-field\" hidden>\n<label class=\"flc-label\" for=\"flc-n\">Cycle count of that value N <span class=\"flc-opt\" id=\"flc-n-opt\">(optional)<\/span><\/label>\n<div class=\"flc-row\"><input id=\"flc-n\" name=\"n\" type=\"number\" inputmode=\"decimal\" step=\"any\" min=\"0\" placeholder=\"e.g. 500000000\" aria-describedby=\"flc-n-hint flc-n-err\"><span class=\"flc-unit\" aria-hidden=\"true\">cycles<\/span><\/div>\n<span class=\"flc-hint\" id=\"flc-n-hint\">The number of cycles at which the fatigue strength was measured.<\/span>\n<span class=\"flc-error\" id=\"flc-n-err\" aria-live=\"polite\"><\/span>\n<\/div>\n<\/div>\n<\/section>\n<section class=\"flc-card\" aria-labelledby=\"flc-h-cond\">\n<h3 class=\"flc-card-title\" id=\"flc-h-cond\"><span class=\"flc-step\" aria-hidden=\"true\">2<\/span>Surface, size, loading and environment<\/h3>\n<p class=\"flc-card-note\">These choices set the Marin modification factors. Correlations are applied only within their documented range.<\/p>\n<div class=\"flc-grid\">\n<div class=\"flc-field\">\n<label class=\"flc-label\" for=\"flc-surface\">Surface finish<\/label>\n<select id=\"flc-surface\" name=\"surface\" aria-describedby=\"flc-surface-hint\">\n<option value=\"ground\">Ground<\/option>\n<option value=\"machined\" selected>Machined<\/option>\n<option value=\"colddrawn\">Cold-Drawn<\/option>\n<option value=\"hotrolled\">Hot-Rolled<\/option>\n<option value=\"forged\">As-Forged<\/option>\n<option value=\"custom\">Custom<\/option>\n<\/select>\n<span class=\"flc-hint\" id=\"flc-surface-hint\"><\/span>\n<\/div>\n<div class=\"flc-field\">\n<label class=\"flc-label\" for=\"flc-geom\">Size-factor geometry<\/label>\n<select id=\"flc-geom\" name=\"geom\" aria-describedby=\"flc-geom-hint\">\n<option value=\"round-rot\" selected>Round bar, rotating bending or torsion<\/option>\n<option value=\"round-nonrot\">Round bar, non-rotating bending<\/option>\n<option value=\"rect\">Rectangular section, non-rotating bending<\/option>\n<option value=\"effective\">Effective diameter already known<\/option>\n<\/select>\n<span class=\"flc-hint\" id=\"flc-geom-hint\"><\/span>\n<\/div>\n<div class=\"flc-field\" id=\"flc-d-field\">\n<label class=\"flc-label\" for=\"flc-d\" id=\"flc-d-label\">Effective Diameter (mm)<\/label>\n<div class=\"flc-row\"><input id=\"flc-d\" name=\"d\" type=\"number\" inputmode=\"decimal\" step=\"any\" min=\"0\" aria-describedby=\"flc-d-hint flc-d-err\"><span class=\"flc-unit\" aria-hidden=\"true\">mm<\/span><\/div>\n<span class=\"flc-hint\" id=\"flc-d-hint\"><\/span>\n<span class=\"flc-error\" id=\"flc-d-err\" aria-live=\"polite\"><\/span>\n<\/div>\n<div class=\"flc-field\" id=\"flc-h-field\" hidden>\n<label class=\"flc-label\" for=\"flc-hdim\">Section depth h (mm)<\/label>\n<div class=\"flc-row\"><input id=\"flc-hdim\" name=\"h\" type=\"number\" inputmode=\"decimal\" step=\"any\" min=\"0\" aria-describedby=\"flc-hdim-err\"><span class=\"flc-unit\" aria-hidden=\"true\">mm<\/span><\/div>\n<span class=\"flc-error\" id=\"flc-hdim-err\" aria-live=\"polite\"><\/span>\n<\/div>\n<div class=\"flc-field\" id=\"flc-b-field\" hidden>\n<label class=\"flc-label\" for=\"flc-bdim\">Section width b (mm)<\/label>\n<div class=\"flc-row\"><input id=\"flc-bdim\" name=\"b\" type=\"number\" inputmode=\"decimal\" step=\"any\" min=\"0\" aria-describedby=\"flc-bdim-err\"><span class=\"flc-unit\" aria-hidden=\"true\">mm<\/span><\/div>\n<span class=\"flc-error\" id=\"flc-bdim-err\" aria-live=\"polite\"><\/span>\n<\/div>\n<div class=\"flc-field flc-span\">\n<span class=\"flc-seg-label\" aria-hidden=\"true\">Loading type<\/span>\n<fieldset class=\"flc-seg\">\n<legend>Loading type<\/legend>\n<input type=\"radio\" id=\"flc-l-bend\" name=\"flc-load\" value=\"bending\" checked><label for=\"flc-l-bend\">Bending<\/label>\n<input type=\"radio\" id=\"flc-l-axial\" name=\"flc-load\" value=\"axial\"><label for=\"flc-l-axial\">Axial Loading<\/label>\n<input type=\"radio\" id=\"flc-l-tors\" name=\"flc-load\" value=\"torsion\"><label for=\"flc-l-tors\">Torsional Loading<\/label>\n<\/fieldset>\n<span class=\"flc-hint\" id=\"flc-load-hint\"><\/span>\n<\/div>\n<div class=\"flc-field\">\n<label class=\"flc-label\" for=\"flc-rel\">Reliability level<\/label>\n<select id=\"flc-rel\" name=\"rel\" aria-describedby=\"flc-rel-hint\">\n<option value=\"50\" selected>50%<\/option>\n<option value=\"90\">90%<\/option>\n<option value=\"95\">95%<\/option>\n<option value=\"99\">99%<\/option>\n<option value=\"99.9\">99.9%<\/option>\n<\/select>\n<span class=\"flc-hint\" id=\"flc-rel-hint\">Factor k<sub>e<\/sub> from Shigley Table 6-5 (Haugen and Wirsching), assuming an 8% standard deviation of the endurance strength.<\/span>\n<\/div>\n<div class=\"flc-field\">\n<label class=\"flc-label\" for=\"flc-temp\">Operating Temperature (&#176;C)<\/label>\n<div class=\"flc-row\"><input id=\"flc-temp\" name=\"temp\" type=\"number\" inputmode=\"decimal\" step=\"any\" aria-describedby=\"flc-temp-hint flc-temp-err\"><span class=\"flc-unit\" aria-hidden=\"true\">&#176;C<\/span><\/div>\n<span class=\"flc-hint\" id=\"flc-temp-hint\"><\/span>\n<span class=\"flc-error\" id=\"flc-temp-err\" aria-live=\"polite\"><\/span>\n<\/div>\n<\/div>\n<\/section>\n<details class=\"flc-card flc-adv\" id=\"flc-adv\">\n<summary><span><span class=\"flc-step\" aria-hidden=\"true\" style=\"margin-right:10px\">3<\/span>Advanced settings: Marin factor overrides<\/span><\/summary>\n<div class=\"flc-adv-body\">\n<p class=\"flc-card-note\">Each factor uses its documented correlation (Auto) when one applies. Choose Custom to enter a value from your own data. When no correlation applies, a custom value is required and the modified endurance limit stays unavailable until you enter one. Allowed range: greater than 0 and at most 1.5.<\/p>\n<div class=\"flc-frow\" data-k=\"ka\"><div><p class=\"flc-frow-name\">Surface factor k<sub>a<\/sub><\/p><p class=\"flc-frow-auto\" id=\"flc-ka-auto\"><\/p><\/div><div class=\"flc-frow-inputs\"><select id=\"flc-ka-mode\" aria-label=\"Surface factor mode\"><option value=\"auto\" selected>Auto<\/option><option value=\"custom\">Custom<\/option><\/select><input id=\"flc-ka-val\" type=\"number\" inputmode=\"decimal\" step=\"any\" aria-label=\"Custom surface factor ka\" aria-describedby=\"flc-ka-val-err\"><\/div><span class=\"flc-error flc-span\" id=\"flc-ka-val-err\" aria-live=\"polite\"><\/span><\/div>\n<div class=\"flc-frow\" data-k=\"kb\"><div><p class=\"flc-frow-name\">Size factor k<sub>b<\/sub><\/p><p class=\"flc-frow-auto\" id=\"flc-kb-auto\"><\/p><\/div><div class=\"flc-frow-inputs\"><select id=\"flc-kb-mode\" aria-label=\"Size factor mode\"><option value=\"auto\" selected>Auto<\/option><option value=\"custom\">Custom<\/option><\/select><input id=\"flc-kb-val\" type=\"number\" inputmode=\"decimal\" step=\"any\" aria-label=\"Custom size factor kb\" aria-describedby=\"flc-kb-val-err\"><\/div><span class=\"flc-error flc-span\" id=\"flc-kb-val-err\" aria-live=\"polite\"><\/span><\/div>\n<div class=\"flc-frow\" data-k=\"kc\"><div><p class=\"flc-frow-name\">Load factor k<sub>c<\/sub><\/p><p class=\"flc-frow-auto\" id=\"flc-kc-auto\"><\/p><\/div><div class=\"flc-frow-inputs\"><select id=\"flc-kc-mode\" aria-label=\"Load factor mode\"><option value=\"auto\" selected>Auto<\/option><option value=\"custom\">Custom<\/option><\/select><input id=\"flc-kc-val\" type=\"number\" inputmode=\"decimal\" step=\"any\" aria-label=\"Custom load factor kc\" aria-describedby=\"flc-kc-val-err\"><\/div><span class=\"flc-error flc-span\" id=\"flc-kc-val-err\" aria-live=\"polite\"><\/span><\/div>\n<div class=\"flc-frow\" data-k=\"kd\"><div><p class=\"flc-frow-name\">Temperature factor k<sub>d<\/sub><\/p><p class=\"flc-frow-auto\" id=\"flc-kd-auto\"><\/p><\/div><div class=\"flc-frow-inputs\"><select id=\"flc-kd-mode\" aria-label=\"Temperature factor mode\"><option value=\"auto\" selected>Auto<\/option><option value=\"custom\">Custom<\/option><\/select><input id=\"flc-kd-val\" type=\"number\" inputmode=\"decimal\" step=\"any\" aria-label=\"Custom temperature factor kd\" aria-describedby=\"flc-kd-val-err\"><\/div><span class=\"flc-error flc-span\" id=\"flc-kd-val-err\" aria-live=\"polite\"><\/span><\/div>\n<div class=\"flc-frow\" data-k=\"ke\"><div><p class=\"flc-frow-name\">Reliability factor k<sub>e<\/sub><\/p><p class=\"flc-frow-auto\" id=\"flc-ke-auto\"><\/p><\/div><div class=\"flc-frow-inputs\"><select id=\"flc-ke-mode\" aria-label=\"Reliability factor mode\"><option value=\"auto\" selected>Auto<\/option><option value=\"custom\">Custom<\/option><\/select><input id=\"flc-ke-val\" type=\"number\" inputmode=\"decimal\" step=\"any\" aria-label=\"Custom reliability factor ke\" aria-describedby=\"flc-ke-val-err\"><\/div><span class=\"flc-error flc-span\" id=\"flc-ke-val-err\" aria-live=\"polite\"><\/span><\/div>\n<div class=\"flc-frow\" data-k=\"kf\"><div><p class=\"flc-frow-name\">Miscellaneous-effects factor k<sub>f<\/sub><\/p><p class=\"flc-frow-auto\">Default 1.0 assumes no additional reduction beyond the factors above. Use only with supporting data. Do not enter the fatigue stress-concentration factor K<sub>f<\/sub> here; it belongs in step 4.<\/p><\/div><div class=\"flc-frow-inputs\"><span class=\"flc-unit\" aria-hidden=\"true\">User value<\/span><input id=\"flc-kf-val\" type=\"number\" inputmode=\"decimal\" step=\"any\" aria-label=\"Miscellaneous-effects factor kf\" aria-describedby=\"flc-kf-val-err\"><\/div><span class=\"flc-error flc-span\" id=\"flc-kf-val-err\" aria-live=\"polite\"><\/span><\/div>\n<\/div>\n<\/details>\n<section class=\"flc-card\" aria-labelledby=\"flc-h-stress\" style=\"margin-top:16px\">\n<h3 class=\"flc-card-title\" id=\"flc-h-stress\"><span class=\"flc-step\" aria-hidden=\"true\">4<\/span>Cyclic stress analysis <span class=\"flc-opt\">(optional)<\/span><\/h3>\n<p class=\"flc-card-note\">Nominal stresses at the critical location, for a single loading type with proportional loading.<\/p>\n<label class=\"flc-check\" for=\"flc-stress-on\"><input type=\"checkbox\" id=\"flc-stress-on\" name=\"stressOn\" checked><span>Include fatigue safety factor analysis<\/span><\/label>\n<div class=\"flc-grid\" id=\"flc-stress-fields\" style=\"margin-top:16px\">\n<div class=\"flc-field\">\n<label class=\"flc-label\" for=\"flc-smax\" id=\"flc-smax-label\">Maximum Stress (&#963;<sub>max<\/sub>)<\/label>\n<div class=\"flc-row\"><input id=\"flc-smax\" name=\"smax\" type=\"number\" inputmode=\"decimal\" step=\"any\" aria-describedby=\"flc-smax-err\"><span class=\"flc-unit flc-ulabel\" aria-hidden=\"true\">MPa<\/span><\/div>\n<span class=\"flc-error\" id=\"flc-smax-err\" aria-live=\"polite\"><\/span>\n<\/div>\n<div class=\"flc-field\">\n<label class=\"flc-label\" for=\"flc-smin\" id=\"flc-smin-label\">Minimum Stress (&#963;<sub>min<\/sub>)<\/label>\n<div class=\"flc-row\"><input id=\"flc-smin\" name=\"smin\" type=\"number\" inputmode=\"decimal\" step=\"any\" aria-describedby=\"flc-smin-hint flc-smin-err\"><span class=\"flc-unit flc-ulabel\" aria-hidden=\"true\">MPa<\/span><\/div>\n<span class=\"flc-hint\" id=\"flc-smin-hint\">Tension positive, compression negative.<\/span>\n<span class=\"flc-error\" id=\"flc-smin-err\" aria-live=\"polite\"><\/span>\n<\/div>\n<div class=\"flc-field\">\n<label class=\"flc-label\" for=\"flc-Kf\">Fatigue stress-concentration factor K<sub>f<\/sub><\/label>\n<input id=\"flc-Kf\" name=\"Kf\" type=\"number\" inputmode=\"decimal\" step=\"any\" min=\"1\" aria-describedby=\"flc-Kf-hint flc-Kf-err\">\n<span class=\"flc-hint\" id=\"flc-Kf-hint\">Multiplies both the alternating and mean nominal stresses (Shigley&#8217;s conventional approach). Use 1.0 for an unnotched section or if your stresses are already local.<\/span>\n<span class=\"flc-error\" id=\"flc-Kf-err\" aria-live=\"polite\"><\/span>\n<\/div>\n<\/div>\n<\/section>\n<div class=\"flc-actions\">\n<button type=\"button\" class=\"flc-btn flc-btn-primary\" id=\"flc-calc\">Calculate<\/button>\n<\/div>\n<p class=\"flc-form-msg\" id=\"flc-form-msg\" aria-live=\"polite\"><\/p>\n<section class=\"flc-card\" id=\"flc-results\" aria-labelledby=\"flc-h-res\" tabindex=\"-1\" hidden>\n<h3 class=\"flc-card-title\" id=\"flc-h-res\"><span class=\"flc-step\" aria-hidden=\"true\">5<\/span>Results<\/h3>\n<p class=\"flc-stale\" id=\"flc-stale\" role=\"status\" hidden>Some inputs are invalid. The results below are from the last valid calculation.<\/p>\n<div class=\"flc-dim\">\n<div class=\"flc-hero\" style=\"margin-top:12px\">\n<div class=\"flc-hero-card\"><div class=\"flc-hero-label\" id=\"flc-r-sep-label\">Unmodified Endurance Limit S&#8242;e<\/div><div class=\"flc-hero-value\" id=\"flc-r-sep\"><\/div><div class=\"flc-hero-sub\" id=\"flc-r-sep-sub\"><\/div><\/div>\n<div class=\"flc-hero-card flc-primary\"><div class=\"flc-hero-label\" id=\"flc-r-se-label\">Modified Endurance Limit Se<\/div><div class=\"flc-hero-value\" id=\"flc-r-se\"><\/div><div class=\"flc-hero-sub\" id=\"flc-r-se-sub\"><\/div><\/div>\n<\/div>\n<h4 class=\"flc-sec\">Marin modification factors<\/h4>\n<div class=\"flc-kpis\" id=\"flc-r-factors\"><\/div>\n<p class=\"flc-formula\" id=\"flc-r-formula\"><\/p>\n<div id=\"flc-r-stress\">\n<h4 class=\"flc-sec\">Cyclic stress<\/h4>\n<div class=\"flc-kpis flc-kpis-4\" id=\"flc-r-skpis\"><\/div>\n<\/div>\n<\/div>\n<\/section>\n<\/form>\n<\/div>\n<script>\n(function () {\n  \"use strict\";\n  \/* =====================================================================\n     REFERENCE DATA\n     Sources: Budynas and Nisbett, Shigley's Mechanical Engineering Design\n     (10th ed.), Chapter 6. Equation and table numbers refer to that text.\n     ===================================================================== *\/\n  var KSI = 6.894757; \/* 1 ksi = 6.894757 MPa *\/\n  var MATS = {\n    carbon: { name: \"Carbon Steel\", steel: true, kdModel: true, needN: false, brittle: false },\n    alloy: { name: \"Alloy Steel\", steel: true, kdModel: true, needN: false, brittle: false },\n    stainless: { name: \"Stainless Steel\", steel: true, kdModel: false, caution: true, needN: false, brittle: false },\n    castiron: { name: \"Cast Iron\", steel: false, kdModel: false, needN: false, brittle: true },\n    aluminum: { name: \"Aluminum Alloy\", steel: false, kdModel: false, needN: true, noPlateau: true, brittle: false },\n    titanium: { name: \"Titanium Alloy\", steel: false, kdModel: false, needN: true, brittle: false },\n    custom: { name: \"Custom Material\", steel: false, kdModel: false, needN: false, brittle: false }\n  };\n  var MAT_INFO = {\n    carbon: [\"Method: Se\u2032 = 0.5\u00b7Sut (Sut \u2264 1400 MPa), 700 MPa above (Shigley Eq. 6-8).\", \"All Marin correlations and the Goodman, Gerber and Soderberg criteria are available.\"],\n    alloy: [\"Method: Se\u2032 = 0.5\u00b7Sut (Sut \u2264 1400 MPa), 700 MPa above (Shigley Eq. 6-8).\", \"All Marin correlations and the Goodman, Gerber and Soderberg criteria are available. Very high-strength or case-hardened alloys often fall below the trend; prefer test data.\"],\n    stainless: [\"Use with caution: the steel correlation was fitted mainly to carbon and low-alloy wrought steels.\", \"Austenitic grades often show a lower fatigue ratio and a less distinct plateau. Enter test data when available. No temperature correction is modeled (kd = 1.0 assumed).\"],\n    castiron: [\"No general tensile-strength correlation is applied. Enter the endurance limit from test data or the applicable standard (for gray iron, tabulated values by ASTM A48 class).\", \"Steel surface, size and load correlations are not applied: enter ka, kb and (for axial or torsion) kc in Advanced settings. Gerber is not available for this brittle material, and Goodman may be unconservative for gray iron.\"],\n    aluminum: [\"Aluminum alloys have no true endurance limit. Enter the fatigue strength at a stated cycle count (published rotating-beam values are commonly given at 5\u00d710\u2078 cycles).\", \"Steel surface and size correlations are not applied: enter ka and kb in Advanced settings. The result is valid only at the stated cycle count.\"],\n    titanium: [\"Fatigue behavior depends strongly on alloy, microstructure and surface condition, so no tensile-strength correlation is applied.\", \"Enter the fatigue strength and its cycle count from test data or the supplier, plus custom ka and kb in Advanced settings.\"],\n    custom: [\"Enter the fully reversed fatigue strength of polished specimens for your material.\", \"No Marin correlations are applied automatically except kc = 1 for bending and the reliability table: enter ka and kb (and kc for axial or torsion) in Advanced settings.\"]\n  };\n  var SURF = {\n    ground: { name: \"Ground\", aM: 1.58, aK: 1.34, b: -0.085 },\n    machined: { name: \"Machined\", aM: 4.51, aK: 2.70, b: -0.265 },\n    colddrawn: { name: \"Cold-drawn\", aM: 4.51, aK: 2.70, b: -0.265 },\n    hotrolled: { name: \"Hot-rolled\", aM: 57.7, aK: 14.4, b: -0.718 },\n    forged: { name: \"As-forged\", aM: 272, aK: 39.9, b: -0.995 },\n    custom: { name: \"Custom\" }\n  };\n  var REL = { \"50\": 1.000, \"90\": 0.897, \"95\": 0.868, \"99\": 0.814, \"99.9\": 0.753 }; \/* Shigley Table 6-5 *\/\n  var KC = { bending: 1.0, axial: 0.85, torsion: 0.59 }; \/* Shigley Eq. 6-26 *\/\n  var FKEYS = [\"ka\", \"kb\", \"kc\", \"kd\", \"ke\"];\n  var FNAME = { ka: \"Surface Factor\", kb: \"Size Factor\", kc: \"Load Factor\", kd: \"Temperature Factor\", ke: \"Reliability Factor\", kf: \"Miscellaneous Factor\" };\n  var DEFAULTS = { unit: \"MPa\", material: \"carbon\", sut: 690, sy: 580, source: \"estimate\", sf: \"\", n: \"\", surface: \"machined\", geom: \"round-rot\", d: 32, h: 20, b: 40, load: \"bending\", rel: \"50\", temp: 20, kf: 1, stressOn: true, smax: 250, smin: 50, Kf: 1 };\n  \/* =====================================================================\n     FORMATTING HELPERS\n     ===================================================================== *\/\n  function isNum(v) { return typeof v === \"number\" ? isFinite(v) : false; }\n  function fix(v, d) { var r = Number(v.toFixed(d)); return r === 0 ? 0 : r; }\n  function fmt(v, d) {\n    if (!isNum(v)) { return \"\u2014\"; }\n    var r = fix(v, d);\n    return (r < 0 ? \"\u2212\" : \"\") + Math.abs(r).toLocaleString(\"en-US\", { minimumFractionDigits: d, maximumFractionDigits: d });\n  }\n  function fmtTrim(v, d) {\n    if (!isNum(v)) { return \"\u2014\"; }\n    var r = fix(v, d);\n    return (r < 0 ? \"\u2212\" : \"\") + Math.abs(r).toLocaleString(\"en-US\", { minimumFractionDigits: 0, maximumFractionDigits: d });\n  }\n  function toU(vMPa, u) { return u === \"ksi\" ? vMPa \/ KSI : vMPa; }\n  function fromU(v, u) { return u === \"ksi\" ? v * KSI : v; }\n  function fmtS(vMPa, u) { if (!isNum(vMPa)) { return \"\u2014\"; } return u === \"ksi\" ? fmt(vMPa \/ KSI, 2) + \" ksi\" : fmt(vMPa, 1) + \" MPa\"; }\n  function fmtAlt(vMPa, u) { return fmtS(vMPa, u === \"ksi\" ? \"MPa\" : \"ksi\"); }\n  function fmtF(v) { return fmt(v, 3); }\n  function fmtN(n) { return n >= 100 ? fmt(n, 0) : fmt(n, 2); }\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 sup(n) { return String(n).split(\"\").map(function (c) { return SUP[c] || c; }).join(\"\"); }\n  function fmtCycles(N) {\n    if (!isNum(N)) { return \"\u2014\"; }\n    if (N < 1e4) { return fmtTrim(N, 0) + \" cycles\"; }\n    var e = Math.floor(Math.log(N) \/ Math.LN10 + 1e-9), m = N \/ Math.pow(10, e), ms = fmtTrim(m, 2);\n    return (ms === \"1\" ? \"\" : ms + \"\u00d7\") + \"10\" + sup(e) + \" cycles\";\n  }\n  \/* =====================================================================\n     ENGINE (pure functions, no DOM). All stresses in MPa internally.\n     ===================================================================== *\/\n  \/* Automatic Marin factors. auto === null means no documented correlation applies. *\/\n  function autoFactors(inp) {\n    var m = MATS[inp.mat], tors = inp.load === \"torsion\", f = {};\n    \/* ka = a * Sut^b  (Shigley Eq. 6-19, Table 6-2); coefficients chosen to match the input unit *\/\n    var ka = { auto: null, basis: \"\", why: \"\" };\n    if (!m.steel) { ka.why = \"No correlation: Shigley\u2019s surface coefficients are fitted to steel data and are not applied to \" + m.name + \". Enter a custom ka.\"; }\n    else if (inp.surface === \"custom\") { ka.why = \"Custom surface finish selected. Enter a custom ka.\"; }\n    else if (!isNum(inp.sut) ? true : inp.sut <= 0) { ka.why = \"Enter Sut to evaluate ka.\"; }\n    else {\n      var s = SURF[inp.surface], ksi = inp.unit === \"ksi\", a = ksi ? s.aK : s.aM, S = ksi ? inp.sut \/ KSI : inp.sut;\n      var raw = a * Math.pow(S, s.b);\n      ka.raw = raw; ka.auto = Math.min(1, raw);\n      ka.basis = \"ka = a\u00b7Sut^b with a = \" + fmtTrim(a, 2) + \" (\" + (ksi ? \"ksi\" : \"MPa\") + \"), b = \" + fmt(s.b, 3) + \" (\" + s.name + \", Shigley Table 6-2)\" + (raw > 1 ? \"; computed \" + fmtF(raw) + \", capped at 1.000\" : \"\");\n    }\n    f.ka = ka;\n    \/* kb: Shigley Eq. 6-20 (bending\/torsion of round steel parts), Eq. 6-21 (axial: kb = 1), Table 6-3 equivalent diameters *\/\n    var kb = { auto: null, basis: \"\", why: \"\", de: null };\n    if (!m.steel) { kb.why = \"No correlation: the size-factor equation is based on steel test data and is not applied to \" + m.name + \". Enter a custom kb.\"; }\n    else if (inp.load === \"axial\") { kb.auto = 1; kb.basis = \"Axial loading: no stress gradient, kb = 1 (Shigley Eq. 6-21).\"; }\n    else {\n      var de = null, gtxt = \"\";\n      if (inp.geom === \"round-rot\") { de = inp.d; gtxt = \"de = d\"; }\n      else if (inp.geom === \"effective\") { de = inp.d; gtxt = \"de entered directly\"; }\n      else if (tors) { kb.why = \"The equivalent-diameter relations of Shigley Table 6-3 apply to non-rotating bending only, not torsion. Enter a custom kb or use a round bar.\"; }\n      else if (inp.geom === \"round-nonrot\") { de = isNum(inp.d) ? 0.370 * inp.d : null; gtxt = \"de = 0.370\u00b7d (Shigley Table 6-3)\"; }\n      else if (inp.geom === \"rect\") { de = (isNum(inp.h) ? isNum(inp.b) : false) ? 0.808 * Math.sqrt(inp.h * inp.b) : null; gtxt = \"de = 0.808\u00b7\u221a(hb) (Shigley Table 6-3)\"; }\n      if (!kb.why) {\n        if (!isNum(de) ? true : de <= 0) { kb.why = \"Enter the section dimension to evaluate kb.\"; }\n        else {\n          kb.de = de;\n          if (de < 2.79) { kb.why = \"de = \" + fmtTrim(de, 2) + \" mm is below the 2.79 mm lower limit of the correlation. Enter a custom kb.\"; }\n          else if (de <= 51) { kb.auto = 1.24 * Math.pow(de, -0.107); kb.basis = \"kb = 1.24\u00b7de^\u22120.107 for 2.79 \u2264 de \u2264 51 mm (Shigley Eq. 6-20); \" + gtxt + \" = \" + fmtTrim(de, 2) + \" mm.\"; }\n          else if (de <= 254) { kb.auto = 1.51 * Math.pow(de, -0.157); kb.basis = \"kb = 1.51\u00b7de^\u22120.157 for 51 < de \u2264 254 mm (Shigley Eq. 6-20); \" + gtxt + \" = \" + fmtTrim(de, 2) + \" mm.\"; }\n          else { kb.why = \"de = \" + fmtTrim(de, 1) + \" mm is above the 254 mm upper limit of the correlation. Enter a custom kb.\"; }\n        }\n      }\n    }\n    f.kb = kb;\n    \/* kc: Shigley Eq. 6-26 *\/\n    var kc = { auto: null, basis: \"\", why: \"\" };\n    if (m.steel) { kc.auto = KC[inp.load]; kc.basis = \"Shigley Eq. 6-26: bending 1.00, axial 0.85, torsion 0.59.\" + (tors ? \" In torsion the result is the shear endurance strength Sse.\" : \"\"); }\n    else if (inp.load === \"bending\") { kc.auto = 1; kc.basis = \"kc = 1: reference fatigue data are assumed to come from rotating-bending tests.\"; }\n    else { kc.why = \"Shigley\u2019s load factors are derived from steel data. Enter kc, or enter reference data measured under \" + inp.load + \" loading and set kc = 1.\"; }\n    f.kc = kc;\n    \/* kd: Shigley Eq. 6-27 polynomial for steels, 70-1000 degF *\/\n    var kd = { auto: null, basis: \"\", why: \"\", assumed: false };\n    var T = inp.temp;\n    if (!isNum(T)) { kd.why = \"Enter the operating temperature.\"; }\n    else if (m.kdModel) {\n      if (T <= 21.1) { kd.auto = 1; kd.basis = \"At or below the 21 \u00b0C (70 \u00b0F) reference temperature: kd = 1.000. Low-temperature embrittlement is not modeled.\"; }\n      else if (T <= 537.8) {\n        var TF = T * 1.8 + 32;\n        kd.auto = 0.975 + 0.432e-3 * TF - 0.115e-5 * TF * TF + 0.104e-8 * Math.pow(TF, 3) - 0.595e-12 * Math.pow(TF, 4);\n        kd.basis = \"Shigley Eq. 6-27 polynomial for steels (70\u20131000 \u00b0F) at T = \" + fmtTrim(TF, 1) + \" \u00b0F.\";\n      } else { kd.why = \"Above 538 \u00b0C (1000 \u00b0F) the Shigley fit does not apply; creep and oxidation govern. Enter a custom kd from elevated-temperature fatigue data.\"; }\n    } else { kd.auto = 1; kd.assumed = true; kd.basis = \"No validated temperature correction for \" + m.name + \": kd = 1.0 assumes temperature effects are neglected.\"; }\n    f.kd = kd;\n    \/* ke: Shigley Table 6-5 *\/\n    f.ke = { auto: REL[inp.rel], basis: inp.rel + \"% reliability, Shigley Table 6-5 (8% standard deviation assumed).\", why: \"\" };\n    return f;\n  }\n  \/* Choose auto or custom value for each factor *\/\n  function resolveFactors(inp) {\n    var f = autoFactors(inp);\n    FKEYS.forEach(function (k) {\n      var F = f[k], cv = inp.custom[k];\n      if (inp.modes[k] === \"custom\" || F.auto === null) {\n        F.src = cv === null ? \"missing\" : \"custom\"; F.value = cv;\n      } else { F.src = F.assumed ? \"assumed\" : \"auto\"; F.value = F.auto; }\n    });\n    f.kf = { value: inp.kf, src: inp.kf === 1 ? \"default\" : \"custom\", basis: inp.kf === 1 ? \"No additional miscellaneous reduction (kf = 1.0).\" : \"User-entered miscellaneous-effects factor.\" };\n    return f;\n  }\n  \/* One mean-stress criterion. Se, Su, Sy: strengths (normal or shear); a: alternating, m: mean (local). *\/\n  function criterion(kind, Se, Su, Sy, a, m) {\n    if (Se === null) { return { n: null, why: \"Modified endurance limit not available.\" }; }\n    if (a === 0 ? m === 0 : false) { return { n: null, why: \"No stress entered.\" }; }\n    if (kind === \"soderberg\" ? Sy === null : false) { return { n: null, why: \"Requires the yield strength Sy.\" }; }\n    if (m <= 0) {\n      if (a === 0) { return { n: null, why: \"Static compressive stress only; fatigue criterion not applicable. See the static yielding check.\" }; }\n      \/* Compressive mean: horizontal line sigma_a = Se\/n (Shigley), mean-stress benefit ignored *\/\n      return { n: Se \/ a, note: m < 0 ? \"Compressive mean stress: n = Se\/\u03c3a (horizontal line, no credit taken for compression).\" : \"Fully reversed: n = Se\/\u03c3a.\" };\n    }\n    if (kind === \"gerber\") {\n      if (a === 0) { return { n: Su \/ m, note: \"No alternating stress: n = Sut\/\u03c3m.\" }; }\n      \/* Shigley Table 6-7: n = 0.5 (Sut\/sm)^2 (sa\/Se) [ -1 + sqrt(1 + (2 sm Se \/ (Sut sa))^2) ] *\/\n      var q = 2 * m * Se \/ (Su * a);\n      return { n: 0.5 * Math.pow(Su \/ m, 2) * (a \/ Se) * (-1 + Math.sqrt(1 + q * q)), note: \"Exact positive root of n\u03c3a\/Se + (n\u03c3m\/Sut)\u00b2 = 1.\" };\n    }\n    var Sx = kind === \"soderberg\" ? Sy : Su;\n    return { n: 1 \/ (a \/ Se + m \/ Sx), note: \"\" };\n  }\n  function compute(inp) {\n    var m = MATS[inp.mat], tors = inp.load === \"torsion\", r = { inp: inp, mat: m, tors: tors, warn: [] };\n    function W(level, text) { r.warn.push({ level: level, text: text }); }\n    \/* ---- Unmodified endurance limit \/ fatigue strength ---- *\/\n    if (inp.source === \"estimate\") {\n      \/* Shigley Eq. 6-8: Se' = 0.5 Sut (Sut <= 1400 MPa), 700 MPa otherwise *\/\n      r.SeP = inp.sut <= 1400 ? 0.5 * inp.sut : 700;\n      r.SePBasis = inp.sut <= 1400 ? \"0.5 \u00d7 Sut (steel correlation, Shigley Eq. 6-8)\" : \"Capped at 700 MPa (100 ksi) because Sut > 1400 MPa (Shigley Eq. 6-8)\";\n      r.kind = \"limit\";\n      if (inp.sut > 1400) { W(\"w\", \"Sut exceeds 1400 MPa, so Se\u2032 is capped at 700 MPa rather than extrapolated. High-strength steels vary widely; use test data where possible.\"); }\n    } else {\n      r.SeP = inp.sf;\n      r.kind = inp.n === null ? \"limit\" : \"strength\";\n      r.SePBasis = \"User test data\" + (inp.n === null ? \"\" : \" at \" + fmtCycles(inp.n));\n    }\n    r.f = resolveFactors(inp);\n    var missing = FKEYS.filter(function (k) { return r.f[k].value === null; });\n    r.missing = missing;\n    if (missing.length) { r.Se = null; }\n    else { r.Se = r.SeP * r.f.ka.value * r.f.kb.value * r.f.kc.value * r.f.kd.value * r.f.ke.value * r.f.kf.value; }\n    \/* ---- Strengths used by the criteria ---- *\/\n    r.Su = tors ? 0.67 * inp.sut : inp.sut;      \/* Ssu = 0.67 Sut (Shigley Eq. 6-54) *\/\n    r.Sy = inp.sy === null ? null : (tors ? 0.577 * inp.sy : inp.sy); \/* Ssy = 0.577 Sy (distortion energy) *\/\n    \/* ---- Cyclic stresses ---- *\/\n    r.stress = null;\n    if (inp.stressOn) {\n      var s = { };\n      s.mNom = (inp.smax + inp.smin) \/ 2;            \/* sigma_m = (smax + smin)\/2 *\/\n      s.aNom = Math.abs(inp.smax - inp.smin) \/ 2;    \/* sigma_a = |smax - smin|\/2 *\/\n      s.R = inp.smax !== 0 ? inp.smin \/ inp.smax : null; \/* R = smin\/smax *\/\n      s.m = inp.Kf * s.mNom; s.a = inp.Kf * s.aNom;\n      if (s.m === 0) { s.m = 0; }\n      s.mUse = tors ? Math.abs(s.m) : s.m;           \/* sign of torsional mean shear is arbitrary *\/\n      s.crit = {\n        goodman: criterion(\"goodman\", r.Se, r.Su, r.Sy, s.a, s.mUse),\n        gerber: m.brittle ? { n: null, why: \"Not available: the Gerber parabola fits ductile-material data and is not recommended for cast iron.\" } : criterion(\"gerber\", r.Se, r.Su, r.Sy, s.a, s.mUse),\n        soderberg: criterion(\"soderberg\", r.Se, r.Su, r.Sy, s.a, s.mUse)\n      };\n      var peak = Math.abs(s.mUse) + s.a;\n      if (r.Sy === null) { s.yield = { n: null, why: \"Enter the yield strength Sy.\" }; }\n      else if (peak === 0) { s.yield = { n: null, why: \"No stress entered.\" }; }\n      else { s.yield = { n: r.Sy \/ peak, note: \"Langer: n = \" + (tors ? \"Ssy\" : \"Sy\") + \"\/(\" + (tors ? \"\u03c4a + |\u03c4m|\" : \"\u03c3a + |\u03c3m|\") + \").\" }; }\n      r.stress = s;\n    }\n    \/* ---- Warnings and assumptions ---- *\/\n    if (m.caution ? inp.source === \"estimate\" : false) { W(\"w\", \"Stainless steel: the 0.5\u00b7Sut correlation and steel Marin factors are applied with caution. Austenitic grades often fall below this trend; test data are preferred.\"); }\n    if (m.noPlateau) { W(\"w\", \"Aluminum alloys have no endurance limit. The modified value is a fatigue strength valid only at \" + fmtCycles(inp.n) + \"; at higher cycle counts the strength keeps decreasing.\"); }\n    else if (r.kind === \"strength\") { W(\"i\", \"The result is a fatigue strength at \" + fmtCycles(inp.n) + \", not an unlimited-life endurance limit.\"); }\n    if (inp.source === \"data\") { W(\"i\", \"Marin factors are applied to your reference data on the assumption that it comes from polished, unnotched specimens. If your data already include surface, size or load effects, set the matching factors to 1 in Advanced settings.\"); }\n    missing.forEach(function (k) { W(\"e\", FNAME[k] + \" \" + k + \": \" + (r.f[k].why || \"custom value required\") + \" The modified endurance limit is not available until a value is entered in Advanced settings.\"); });\n    if (r.f.ka.raw > 1 ? r.f.ka.src === \"auto\" : false) { W(\"i\", \"The surface-factor equation gives \" + fmtF(r.f.ka.raw) + \" at this low strength; ka is capped at 1.000.\"); }\n    if (r.f.kd.assumed ? r.f.kd.src === \"assumed\" : false) {\n      W(inp.temp > 21.1 ? \"w\" : \"i\", \"Temperature not corrected: the estimate does not account for elevated-temperature fatigue degradation for \" + m.name + \" (kd = 1.0, temperature effects neglected). Operating temperature: \" + fmtTrim(inp.temp, 1) + \" \u00b0C.\");\n    }\n    if (inp.temp < 0) { W(\"w\", \"Below 0 \u00b0C: low-temperature embrittlement (for example the ductile-to-brittle transition of ferritic steels and cast iron) is not modeled. Check impact toughness separately.\"); }\n    [\"ka\", \"kb\", \"kc\", \"kd\", \"ke\"].forEach(function (k) { if (r.f[k].src === \"custom\" ? r.f[k].value > 1 : false) { W(\"w\", k + \" = \" + fmtF(r.f[k].value) + \" is above 1. Beneficial effects must be supported by test data.\"); } });\n    if (inp.kf !== 1) { W(inp.kf > 1 ? \"w\" : \"i\", \"Miscellaneous factor kf = \" + fmtF(inp.kf) + \" applied. It does not model corrosion, welds, residual stress or notches unless your supporting data do.\"); }\n    if (tors) { W(\"i\", \"Torsion: the modified value is the shear endurance strength Sse (kc = 0.59 for steel converts normal to shear). Criteria use Ssu = 0.67\u00b7Sut (Shigley Eq. 6-54) and Ssy = 0.577\u00b7Sy (distortion energy). Compare only with shear stresses.\"); }\n    if (inp.stressOn) {\n      W(\"i\", \"Safety factors assume proportional loading (the stress ratio stays constant as load grows) and a single loading type. Combined bending, axial and torsional stresses need von Mises equivalent alternating and mean stresses (Shigley Section 6-14) or a multiaxial fatigue method.\");\n      if (inp.Kf > 1) { W(\"i\", \"Kf = \" + fmtTrim(inp.Kf, 3) + \" is applied to both the alternating and mean stresses. Mean and alternating values shown are local (notch) stresses.\"); }\n      if (m.brittle) { W(\"w\", \"Cast iron: Goodman may be unconservative for gray iron, whose test data follow the lower Smith\u2013Dolan locus (Shigley Section 6-15). Soderberg and the yield check apply only if the iron has a defined yield strength (for example ductile iron).\"); }\n      var y = r.stress.yield;\n      if (y.n !== null ? y.n < 1 : false) { W(\"e\", \"Static yielding is predicted on the first cycle (ny < 1). Goodman and Gerber do not check for yielding; resolve this before relying on the fatigue result.\"); }\n      var anyLow = [\"goodman\", \"gerber\", \"soderberg\"].some(function (k) { var c = r.stress.crit[k]; return c.n !== null ? c.n < 1 : false; });\n      if (anyLow) { W(\"e\", \"At least one criterion gives n < 1, meaning that criterion predicts fatigue failure at these stresses.\"); }\n    }\n    return r;\n  }\n  function finiteResult(r) {\n    if (!isNum(r.SeP)) { return false; }\n    if (r.Se !== null ? !isNum(r.Se) : false) { return false; }\n    var bad = false;\n    FKEYS.concat([\"kf\"]).forEach(function (k) { var v = r.f[k].value; if (v !== null ? !isNum(v) : false) { bad = true; } });\n    if (r.stress) {\n      [\"m\", \"a\"].forEach(function (k) { if (!isNum(r.stress[k])) { bad = true; } });\n      [\"goodman\", \"gerber\", \"soderberg\"].forEach(function (k) { var n = r.stress.crit[k].n; if (n !== null ? !isNum(n) : false) { bad = true; } });\n      if (r.stress.yield.n !== null ? !isNum(r.stress.yield.n) : false) { bad = true; }\n    }\n    return !bad;\n  }\n  \/* =====================================================================\n     UI\n     ===================================================================== *\/\n  function init() {\n    var root = document.getElementById(\"flc-calculator\");\n    if (!root) { return; }\n    if (root.getAttribute(\"data-flc-init\") === \"1\") { return; }\n    root.setAttribute(\"data-flc-init\", \"1\");\n    root.flcEngine = { compute: compute, criterion: criterion, autoFactors: autoFactors };\n    function $(id) { return root.querySelector(\"#\" + id); }\n    function mk(tag, cls, text) { var n = document.createElement(tag); if (cls) { n.className = cls; } if (text !== undefined) { n.textContent = text; } return n; }\n    function clear(n) { while (n.firstChild) { n.removeChild(n.firstChild); } }\n    function radioVal(name) { var r = root.querySelector('input[name=\"' + name + '\"]:checked'); return r ? r.value : null; }\n    function setRadio(name, v) { var r = root.querySelector('input[name=\"' + name + '\"][value=\"' + v + '\"]'); if (r) { r.checked = true; } }\n    var el = {\n      form: $(\"flc-form\"), material: $(\"flc-material\"), info: $(\"flc-mat-info\"), sut: $(\"flc-sut\"), sy: $(\"flc-sy\"),\n      source: $(\"flc-source\"), sourceField: $(\"flc-source-field\"), sourceHint: $(\"flc-source-hint\"), sf: $(\"flc-sf\"), sfField: $(\"flc-sf-field\"), sfLabel: $(\"flc-sf-label\"),\n      n: $(\"flc-n\"), nField: $(\"flc-n-field\"), nOpt: $(\"flc-n-opt\"), surface: $(\"flc-surface\"), surfaceHint: $(\"flc-surface-hint\"),\n      geom: $(\"flc-geom\"), geomHint: $(\"flc-geom-hint\"), d: $(\"flc-d\"), dLabel: $(\"flc-d-label\"), dHint: $(\"flc-d-hint\"), dField: $(\"flc-d-field\"),\n      h: $(\"flc-hdim\"), hField: $(\"flc-h-field\"), b: $(\"flc-bdim\"), bField: $(\"flc-b-field\"), loadHint: $(\"flc-load-hint\"),\n      rel: $(\"flc-rel\"), temp: $(\"flc-temp\"), tempHint: $(\"flc-temp-hint\"), kf: $(\"flc-kf-val\"), adv: $(\"flc-adv\"),\n      stressOn: $(\"flc-stress-on\"), stressFields: $(\"flc-stress-fields\"), smax: $(\"flc-smax\"), smin: $(\"flc-smin\"), Kf: $(\"flc-Kf\"),\n      smaxLabel: $(\"flc-smax-label\"), sminLabel: $(\"flc-smin-label\"),\n      calc: $(\"flc-calc\"), formMsg: $(\"flc-form-msg\"),\n      results: $(\"flc-results\"), stale: $(\"flc-stale\"), sep: $(\"flc-r-sep\"), sepLabel: $(\"flc-r-sep-label\"), sepSub: $(\"flc-r-sep-sub\"),\n      se: $(\"flc-r-se\"), seLabel: $(\"flc-r-se-label\"), seSub: $(\"flc-r-se-sub\"), factors: $(\"flc-r-factors\"), formula: $(\"flc-r-formula\"),\n      stressBox: $(\"flc-r-stress\"), skpis: $(\"flc-r-skpis\")\n    };\n    FKEYS.forEach(function (k) { el[k + \"Mode\"] = $(\"flc-\" + k + \"-mode\"); el[k + \"Val\"] = $(\"flc-\" + k + \"-val\"); el[k + \"Auto\"] = $(\"flc-\" + k + \"-auto\"); });\n    var state = { live: false, last: null, timer: null, lastUnit: \"MPa\", rzT: null };\n    function unit() { return radioVal(\"flc-unit\") || \"MPa\"; }\n    function load() { return radioVal(\"flc-load\") || \"bending\"; }\n    function mat() { return MATS[el.material.value]; }\n    function source() { return mat().steel ? el.source.value : \"data\"; }\n    \/* ---------- reading numbers ---------- *\/\n    function readNum(input) {\n      var s = String(input.value).trim();\n      if (s === \"\") { return (input.validity ? input.validity.badInput : false) ? NaN : null; }\n      var v = Number(s);\n      return isFinite(v) ? v : NaN;\n    }\n    function setVal(input, v, d) { input.value = (v === null ? true : v === \"\") ? \"\" : String(fix(Number(v), d === undefined ? 6 : d)); }\n    \/* ---------- validation ---------- *\/\n    function setErr(input, msg) {\n      var e = $(input.id + \"-err\");\n      if (e) { e.textContent = msg || \"\"; }\n      if (msg) { input.classList.add(\"flc-invalid\"); input.setAttribute(\"aria-invalid\", \"true\"); }\n      else { input.classList.remove(\"flc-invalid\"); input.removeAttribute(\"aria-invalid\"); }\n      return !msg;\n    }\n    function numCheck(input, opts) {\n      var v = readNum(input);\n      if (v === null) { return opts.optional ? setErr(input, \"\") : setErr(input, opts.req); }\n      if (isNaN(v)) { return setErr(input, \"Enter a valid number.\"); }\n      return setErr(input, opts.check(v) || \"\");\n    }\n    function uTxt(mpa) { return fmtS(mpa, unit()); }\n    function vSut() {\n      return numCheck(el.sut, { req: \"Enter the ultimate tensile strength.\", check: function (v) {\n        var mpa = fromU(v, unit());\n        if (mpa <= 0) { return \"Ultimate tensile strength must be greater than zero.\"; }\n        if (mpa > 3500) { return \"Sut above \" + uTxt(3500) + \" is outside the range of engineering metals. Check the unit.\"; }\n        return \"\";\n      } });\n    }\n    function vSy() {\n      return numCheck(el.sy, { optional: true, check: function (v) {\n        if (v <= 0) { return \"Yield strength must be greater than zero, or leave it blank.\"; }\n        var sut = readNum(el.sut);\n        if (isNum(sut) ? v > sut : false) { return \"Yield strength cannot exceed the ultimate tensile strength.\"; }\n        return \"\";\n      } });\n    }\n    function vSf() {\n      if (source() !== \"data\") { return setErr(el.sf, \"\"); }\n      return numCheck(el.sf, { req: \"Enter the reference fatigue strength from test data.\", check: function (v) {\n        if (v <= 0) { return \"Fatigue strength must be greater than zero.\"; }\n        var sut = readNum(el.sut);\n        if (isNum(sut) ? v >= sut : false) { return \"Fatigue strength must be lower than the ultimate tensile strength.\"; }\n        return \"\";\n      } });\n    }\n    function vN() {\n      if (source() !== \"data\") { return setErr(el.n, \"\"); }\n      return numCheck(el.n, { optional: !mat().needN, req: \"Enter the cycle count at which the fatigue strength applies (required for this material).\", check: function (v) {\n        if (v < 1000) { return \"Enter at least 1,000 cycles (high-cycle fatigue range).\"; }\n        if (v > 1e11) { return \"Enter at most 10\u00b9\u00b9 cycles.\"; }\n        return \"\";\n      } });\n    }\n    function geomUsesD() { return el.geom.value !== \"rect\"; }\n    function needsSize() { return mat().steel ? load() !== \"axial\" : false; }\n    function vDim(input, name) {\n      return numCheck(input, { req: \"Enter the \" + name + \".\", check: function (v) {\n        if (v <= 0) { return \"The \" + name + \" must be greater than zero.\"; }\n        if (v > 10000) { return \"The \" + name + \" must not exceed 10,000 mm.\"; }\n        return \"\";\n      } });\n    }\n    function vD() { if (!needsSize() ? true : !geomUsesD()) { return setErr(el.d, \"\"); } return vDim(el.d, \"diameter\"); }\n    function vH() { if (!needsSize() ? true : geomUsesD()) { return setErr(el.h, \"\"); } return vDim(el.h, \"section depth\"); }\n    function vB() { if (!needsSize() ? true : geomUsesD()) { return setErr(el.b, \"\"); } return vDim(el.b, \"section width\"); }\n    function vTemp() {\n      return numCheck(el.temp, { req: \"Enter the operating temperature.\", check: function (v) {\n        if (v < -200) { return \"Enter a temperature of at least \u2212200 \u00b0C.\"; }\n        if (v > 1000) { return \"Enter a temperature of at most 1,000 \u00b0C.\"; }\n        return \"\";\n      } });\n    }\n    function vFactor(k) {\n      var input = el[k + \"Val\"];\n      if (input.disabled) { return setErr(input, \"\"); }\n      return numCheck(input, { optional: true, check: function (v) {\n        if (v <= 0) { return \"The factor must be greater than zero.\"; }\n        if (v > 1.5) { return \"The factor must not exceed 1.5.\"; }\n        return \"\";\n      } });\n    }\n    function vKf() {\n      return numCheck(el.kf, { req: \"Enter kf (1.0 if no miscellaneous effects).\", check: function (v) {\n        if (v <= 0) { return \"kf must be greater than zero.\"; }\n        if (v > 1.5) { return \"kf must not exceed 1.5.\"; }\n        return \"\";\n      } });\n    }\n    function vStress(input, name) {\n      if (!el.stressOn.checked) { return setErr(input, \"\"); }\n      return numCheck(input, { req: \"Enter the \" + name + \".\", check: function (v) {\n        if (Math.abs(fromU(v, unit())) > 10000) { return \"The magnitude must not exceed \" + uTxt(10000) + \".\"; }\n        return \"\";\n      } });\n    }\n    function vSmax() { return vStress(el.smax, \"maximum stress\"); }\n    function vSmin() {\n      var ok = vStress(el.smin, \"minimum stress\");\n      if (!ok ? true : !el.stressOn.checked) { return ok; }\n      var a = readNum(el.smax), b = readNum(el.smin);\n      if (isNum(a) ? (isNum(b) ? b > a : false) : false) { return setErr(el.smin, \"The minimum stress cannot be greater than the maximum stress.\"); }\n      return true;\n    }\n    function vKfc() {\n      if (!el.stressOn.checked) { return setErr(el.Kf, \"\"); }\n      return numCheck(el.Kf, { req: \"Enter Kf (1.0 for an unnotched section).\", check: function (v) {\n        if (v < 1) { return \"Kf must be at least 1.0.\"; }\n        if (v > 10) { return \"Kf must not exceed 10.\"; }\n        return \"\";\n      } });\n    }\n    var VALIDATORS = {\n      \"flc-sut\": function () { vSut(); vSy(); return vSf(); }, \"flc-sy\": vSy, \"flc-sf\": vSf, \"flc-n\": vN,\n      \"flc-d\": vD, \"flc-hdim\": vH, \"flc-bdim\": vB, \"flc-temp\": vTemp, \"flc-kf-val\": vKf,\n      \"flc-smax\": function () { vSmax(); return vSmin(); }, \"flc-smin\": vSmin, \"flc-Kf\": vKfc\n    };\n    FKEYS.forEach(function (k) { VALIDATORS[\"flc-\" + k + \"-val\"] = function () { return vFactor(k); }; });\n    function validateAll() {\n      var res = [vSut(), vSy(), vSf(), vN(), vD(), vH(), vB(), vTemp(), vKf(), vSmax(), vSmin(), vKfc()];\n      FKEYS.forEach(function (k) { res.push(vFactor(k)); });\n      return res.every(Boolean);\n    }\n    function nOrNull(input) { var v = readNum(input); return isNum(v) ? v : null; }\n    function readInput() {\n      var u = unit(), custom = {}, modes = {};\n      FKEYS.forEach(function (k) { modes[k] = el[k + \"Mode\"].value; custom[k] = el[k + \"Val\"].disabled ? null : nOrNull(el[k + \"Val\"]); });\n      var sy = nOrNull(el.sy);\n      return {\n        unit: u, mat: el.material.value, sut: fromU(readNum(el.sut), u), sy: sy === null ? null : fromU(sy, u),\n        source: source(), sf: source() === \"data\" ? fromU(readNum(el.sf), u) : null, n: source() === \"data\" ? nOrNull(el.n) : null,\n        surface: el.surface.value, geom: el.geom.value, d: nOrNull(el.d), h: nOrNull(el.h), b: nOrNull(el.b),\n        load: load(), rel: el.rel.value, temp: readNum(el.temp), modes: modes, custom: custom, kf: readNum(el.kf),\n        stressOn: el.stressOn.checked, smax: fromU(readNum(el.smax), u), smin: fromU(readNum(el.smin), u), Kf: readNum(el.Kf)\n      };\n    }\n    \/* ---------- dependent UI ---------- *\/\n    function updateMaterialUI() {\n      var m = mat(), k = el.material.value;\n      clear(el.info);\n      var p1 = mk(\"p\"); p1.appendChild(mk(\"strong\", \"\", m.name + \". \")); p1.appendChild(document.createTextNode(MAT_INFO[k][0])); el.info.appendChild(p1);\n      el.info.appendChild(mk(\"p\", \"\", MAT_INFO[k][1]));\n      el.info.className = \"flc-info flc-span\" + (m.steel ? (m.caution ? \" flc-info-warn\" : \"\") : \" flc-info-warn\");\n      el.sourceField.hidden = !m.steel;\n      el.sourceHint.textContent = el.source.value === \"estimate\" ? \"Se\u2032 = 0.5\u00b7Sut up to 1400 MPa (200 ksi), 700 MPa (100 ksi) above. Choose test data if you have it.\" : \"Your test data replace the tensile-strength correlation.\";\n      var data = source() === \"data\";\n      el.sfField.hidden = !data; el.nField.hidden = !data;\n      el.nOpt.textContent = m.needN ? \"(required)\" : \"(optional)\";\n      el.n.placeholder = m.noPlateau ? \"e.g. 500000000\" : \"e.g. 10000000\";\n      $(\"flc-n-hint\").textContent = m.noPlateau ? \"Required: aluminum has no endurance limit, so the strength must be tied to a cycle count (commonly 5\u00d710\u2078).\" : (m.needN ? \"Required: fatigue strength for this material is quoted at a specific cycle count (commonly 10\u2077).\" : \"Leave blank if the value is an endurance limit (plateau); enter N if it is a fatigue strength at a specific life.\");\n      el.sfLabel.innerHTML = \"\";\n      el.sfLabel.appendChild(document.createTextNode(m.noPlateau ? \"Reference fatigue strength S\u2032\" : \"Reference endurance limit or fatigue strength S\u2032\"));\n      var sb = document.createElement(\"sub\"); sb.textContent = \"f\"; el.sfLabel.appendChild(sb);\n      el.surfaceHint.textContent = m.steel ? (el.surface.value === \"custom\" ? \"Enter ka in Advanced settings.\" : \"ka = a\u00b7Sut^b, Shigley Table 6-2.\" + (el.surface.value === \"colddrawn\" ? \" Cold-drawn uses the machined coefficients.\" : \"\")) : \"Steel surface coefficients are not applied to \" + m.name + \". Enter ka in Advanced settings.\";\n      updateTempHint();\n    }\n    function updateTempHint() {\n      var m = mat();\n      el.tempHint.textContent = m.kdModel ? \"Carbon and alloy steels: kd from Shigley Eq. 6-27 between 21 and 538 \u00b0C. Above 538 \u00b0C a custom kd is required.\" : \"No validated temperature correction for \" + m.name + \". The temperature is recorded but the fatigue limit is not corrected (kd = 1.0 assumed).\";\n    }\n    var GEOM_HINT = {\n      \"round-rot\": \"Rotating round bar in bending, or round bar in torsion: enter the actual diameter.\",\n      \"round-nonrot\": \"Non-rotating round bar in bending: de = 0.370\u00b7d is calculated (Shigley Table 6-3).\",\n      \"rect\": \"Non-rotating rectangular section in bending: de = 0.808\u00b7\u221a(hb) is calculated (Shigley Table 6-3).\",\n      \"effective\": \"Enter an equivalent diameter you have derived (95% stressed-area method). Other shapes or loadings: use a custom kb.\"\n    };\n    function updateGeomUI() {\n      var rect = el.geom.value === \"rect\";\n      el.dField.hidden = rect; el.hField.hidden = !rect; el.bField.hidden = !rect;\n      el.dLabel.textContent = el.geom.value === \"effective\" ? \"Effective Diameter (mm)\" : \"Diameter d (mm)\";\n      el.geomHint.textContent = GEOM_HINT[el.geom.value];\n      var axial = load() === \"axial\";\n      el.dHint.textContent = axial ? \"Not used for axial loading: kb = 1 (no stress gradient).\" : (mat().steel ? \"The size-factor correlation depends on geometry and loading and is valid for 2.79 \u2264 de \u2264 254 mm.\" : \"The steel size correlation is not applied to \" + mat().name + \"; enter kb in Advanced settings.\");\n    }\n    function updateLoadUI() {\n      var l = load(), tors = l === \"torsion\";\n      el.loadHint.textContent = l === \"bending\" ? \"Normal-stress fatigue under bending (kc = 1.00 for steel).\" : (l === \"axial\" ? \"Push-pull loading of the whole section (kc = 0.85 for steel, kb = 1).\" : \"Shear fatigue: the result is a shear endurance strength Sse, distinct from the normal-stress endurance limit (kc = 0.59 for steel).\");\n      el.smaxLabel.innerHTML = tors ? \"Maximum Shear Stress (&#964;<sub>max<\/sub>)\" : \"Maximum Stress (&#963;<sub>max<\/sub>)\";\n      el.sminLabel.innerHTML = tors ? \"Minimum Shear Stress (&#964;<sub>min<\/sub>)\" : \"Minimum Stress (&#963;<sub>min<\/sub>)\";\n      updateGeomUI();\n    }\n    function updateUnitLabels() {\n      var u = unit(), a = root.querySelectorAll(\".flc-ulabel\"), i;\n      for (i = 0; i < a.length; i++) { a[i].textContent = u; }\n    }\n    function updateStressUI() { el.stressFields.hidden = !el.stressOn.checked; }\n    function updateFactorUI(af) {\n      FKEYS.forEach(function (k) {\n        var F = af[k], mode = el[k + \"Mode\"], val = el[k + \"Val\"], txt = el[k + \"Auto\"];\n        var unavailable = F.auto === null;\n        var autoOpt = mode.querySelector('option[value=\"auto\"]');\n        autoOpt.textContent = unavailable ? \"Auto (n\/a)\" : \"Auto\";\n        txt.textContent = unavailable ? F.why : \"Auto: \" + fmtF(F.auto) + \". \" + F.basis;\n        val.disabled = unavailable ? false : mode.value !== \"custom\";\n        val.placeholder = unavailable ? \"Required\" : (val.disabled ? fmtF(F.auto) : \"e.g. 0.90\");\n        if (val.disabled) { setErr(val, \"\"); }\n      });\n    }\n    function updateAllUI() { updateUnitLabels(); updateMaterialUI(); updateLoadUI(); updateStressUI(); }\n    \/* ---------- unit switching converts entered stresses ---------- *\/\n    function onUnit() {\n      var u = unit();\n      if (u === state.lastUnit) { return; }\n      [el.sut, el.sy, el.sf, el.smax, el.smin].forEach(function (i) {\n        var v = readNum(i);\n        if (isNum(v)) { setVal(i, u === \"ksi\" ? v \/ KSI : v * KSI, u === \"ksi\" ? 3 : 2); }\n      });\n      state.lastUnit = u;\n      updateUnitLabels();\n    }\n    \/* =====================================================================\n       RENDER RESULTS\n       ===================================================================== *\/\n    function badge(src) {\n      var map = { auto: [\"Auto\", \"flc-b-auto\"], custom: [\"Custom\", \"flc-b-custom\"], assumed: [\"Assumed\", \"flc-b-assumed\"], missing: [\"Required\", \"flc-b-missing\"], \"default\": [\"Default\", \"flc-b-auto\"] };\n      var b = map[src] || map.auto; return mk(\"span\", \"flc-badge \" + b[1], b[0]);\n    }\n    function factorCard(k, F) {\n      var c = mk(\"div\", \"flc-kpi\"), lab = mk(\"div\", \"flc-kpi-label\");\n      lab.appendChild(document.createTextNode(FNAME[k] + \" \" + k)); lab.appendChild(badge(F.src));\n      c.appendChild(lab);\n      c.appendChild(mk(\"div\", \"flc-kpi-value\" + (F.value === null ? \" flc-na\" : \"\"), F.value === null ? \"Not Available\" : fmtF(F.value)));\n      var sub = F.value === null ? (F.why || \"Enter a custom value in Advanced settings.\") : (F.src === \"custom\" ? \"User-entered value.\" + (F.auto !== null ? \" Correlation would give \" + fmtF(F.auto) + \".\" : \"\") : F.basis);\n      c.appendChild(mk(\"div\", \"flc-kpi-sub\", sub));\n      return c;\n    }\n    function kpi(label, value, sub, na) {\n      var c = mk(\"div\", \"flc-kpi\");\n      c.appendChild(mk(\"div\", \"flc-kpi-label\", label));\n      c.appendChild(mk(\"div\", \"flc-kpi-value\" + (na ? \" flc-na\" : \"\"), value));\n      if (sub) { c.appendChild(mk(\"div\", \"flc-kpi-sub\", sub)); }\n      return c;\n    }\n    function render(r, scroll) {\n      var inp = r.inp, u = inp.unit, tors = r.tors;\n      root.classList.remove(\"flc-is-stale\"); el.stale.hidden = true;\n      \/* --- Se' and Se --- *\/\n      var limitWord = r.kind === \"strength\" ? \"Fatigue Strength\" : \"Endurance Limit\";\n      el.sepLabel.textContent = \"Unmodified \" + limitWord + (r.kind === \"strength\" ? \" S\u2032f\" : \" S\u2032e\");\n      el.sep.textContent = fmtS(r.SeP, u); el.sep.className = \"flc-hero-value\";\n      el.sepSub.textContent = fmtAlt(r.SeP, u) + \" \u00b7 \" + r.SePBasis;\n      el.seLabel.textContent = tors ? \"Modified Shear \" + limitWord + (r.kind === \"strength\" ? \" Ssf\" : \" Sse\") : \"Modified \" + limitWord + (r.kind === \"strength\" ? \" Sf\" : \" Se\");\n      if (r.Se === null) {\n        el.se.textContent = \"Not Available\"; el.se.className = \"flc-hero-value flc-na\";\n        el.seSub.textContent = \"Missing factor\" + (r.missing.length > 1 ? \"s \" : \" \") + r.missing.join(\", \") + \": enter a custom value in Advanced settings.\";\n      } else {\n        el.se.textContent = fmtS(r.Se, u); el.se.className = \"flc-hero-value\";\n        el.seSub.textContent = fmtAlt(r.Se, u) + \" \u00b7 \" + fmt(r.Se \/ r.SeP * 100, 1) + \"% of the unmodified value\" + (r.kind === \"strength\" ? \" \u00b7 at \" + fmtCycles(inp.n) : \"\") + (tors ? \" \u00b7 shear strength\" : \"\");\n      }\n      \/* --- factors --- *\/\n      clear(el.factors);\n      FKEYS.concat([\"kf\"]).forEach(function (k) { el.factors.appendChild(factorCard(k, r.f[k])); });\n      var parts = FKEYS.concat([\"kf\"]).map(function (k) { return r.f[k].value === null ? k + \" = ?\" : fmtF(r.f[k].value); });\n      el.formula.textContent = (tors ? \"Sse\" : \"Se\") + \" = ka \u00b7 kb \u00b7 kc \u00b7 kd \u00b7 ke \u00b7 kf \u00b7 S\u2032 = \" + parts.join(\" \u00d7 \") + \" \u00d7 \" + fmtS(r.SeP, u) + \" = \" + (r.Se === null ? \"not available\" : fmtS(r.Se, u));\n      \/* --- stress analysis --- *\/\n      el.stressBox.hidden = !r.stress;\n      if (r.stress) {\n        var s = r.stress, sym = tors ? \"\u03c4\" : \"\u03c3\";\n        clear(el.skpis);\n        el.skpis.appendChild(kpi(\"Mean Stress \" + sym + \"m\", fmtS(s.m, u), inp.Kf !== 1 ? \"Local, Kf \u00d7 \" + fmtS(s.mNom, u) + \" nominal\" : \"(\" + sym + \"max + \" + sym + \"min) \/ 2\"));\n        el.skpis.appendChild(kpi(\"Alternating Stress \" + sym + \"a\", fmtS(s.a, u), inp.Kf !== 1 ? \"Local, Kf \u00d7 \" + fmtS(s.aNom, u) + \" nominal\" : \"|\" + sym + \"max \u2212 \" + sym + \"min| \/ 2\"));\n        el.skpis.appendChild(kpi(\"Stress Ratio R\", s.R === null ? \"Unavailable\" : fmt(s.R, 3), s.R === null ? \"Undefined because \" + sym + \"max = 0\" : sym + \"min \/ \" + sym + \"max\", s.R === null));\n        el.skpis.appendChild(kpi(\"Peak Stress\", fmtS(Math.abs(s.mUse) + s.a, u), \"|\" + sym + \"m| + \" + sym + \"a, peak local stress\"));\n      }\n      if (scroll) { focusResults(); }\n    }\n    function focusResults() {\n      try { el.results.focus({ preventScroll: true }); } catch (e) { \/* ignore *\/ }\n      var rect = el.results.getBoundingClientRect(), vh = window.innerHeight || document.documentElement.clientHeight;\n      if (rect.top < 0 ? true : rect.top > vh * 0.55) { if (el.results.scrollIntoView) { el.results.scrollIntoView({ behavior: \"smooth\", block: \"start\" }); } }\n    }\n    \/* =====================================================================\n       CALCULATE \/ LIVE UPDATE\n       ===================================================================== *\/\n    function run(fromButton) {\n      el.formMsg.textContent = \"\";\n      var raw = readInput();\n      updateFactorUI(autoFactors(raw));\n      var ok = validateAll();\n      if (!ok) {\n        if (fromButton) {\n          el.formMsg.textContent = \"Please correct the highlighted fields.\";\n          var first = root.querySelector(\".flc-invalid\");\n          if (first) { var det = first.closest ? first.closest(\"details\") : null; if (det) { det.open = true; } first.focus(); }\n        }\n        if (state.last) { root.classList.add(\"flc-is-stale\"); el.stale.hidden = false; }\n        return;\n      }\n      var r = compute(readInput());\n      if (!finiteResult(r)) {\n        el.formMsg.textContent = \"The inputs produce a non-finite result. Check the values and units.\";\n        if (state.last) { root.classList.add(\"flc-is-stale\"); el.stale.hidden = false; }\n        return;\n      }\n      state.last = r; state.live = true;\n      el.results.hidden = false;\n      render(r, fromButton);\n    }\n    function schedule() { clearTimeout(state.timer); state.timer = setTimeout(function () { if (state.live) { run(false); } else { updateFactorUI(autoFactors(readInput())); } }, 150); }\n    function applyDefaults() {\n      var D = DEFAULTS;\n      setRadio(\"flc-unit\", D.unit); state.lastUnit = D.unit;\n      el.material.value = D.material; el.source.value = D.source; el.surface.value = D.surface; el.geom.value = D.geom; el.rel.value = D.rel;\n      setRadio(\"flc-load\", D.load);\n      setVal(el.sut, D.sut); setVal(el.sy, D.sy); setVal(el.sf, D.sf); setVal(el.n, D.n);\n      setVal(el.d, D.d); setVal(el.h, D.h); setVal(el.b, D.b); setVal(el.temp, D.temp); setVal(el.kf, D.kf);\n      el.stressOn.checked = D.stressOn; setVal(el.smax, D.smax); setVal(el.smin, D.smin); setVal(el.Kf, D.Kf);\n      FKEYS.forEach(function (k) { el[k + \"Mode\"].value = \"auto\"; el[k + \"Val\"].value = \"\"; });\n      var all = root.querySelectorAll(\".flc-invalid\"), i;\n      for (i = 0; i < all.length; i++) { all[i].classList.remove(\"flc-invalid\"); all[i].removeAttribute(\"aria-invalid\"); }\n      var errs = root.querySelectorAll(\".flc-error\");\n      for (i = 0; i < errs.length; i++) { errs[i].textContent = \"\"; }\n      el.formMsg.textContent = \"\";\n      updateAllUI();\n    }\n    \/* ---------- events (bound once) ---------- *\/\n    function onFieldEvent(e) {\n      var t = e.target;\n      if (!t ? true : !(t.id || t.name)) { return; }\n      if (t.name === \"flc-unit\") { onUnit(); }\n      if (t.id === \"flc-material\" ? true : (t.id === \"flc-source\" ? true : t.id === \"flc-surface\")) { updateMaterialUI(); vSf(); vN(); }\n      if (t.id === \"flc-geom\") { updateGeomUI(); vD(); vH(); vB(); }\n      if (t.name === \"flc-load\") { updateLoadUI(); }\n      if (t.id === \"flc-material\") { updateGeomUI(); }\n      if (t.id === \"flc-stress-on\") { updateStressUI(); }\n      if (VALIDATORS[t.id]) { VALIDATORS[t.id](); }\n      schedule();\n    }\n    function isChoice(t) { return !t ? false : (t.tagName === \"SELECT\" ? true : (t.type === \"radio\" ? true : t.type === \"checkbox\")); }\n    el.form.addEventListener(\"input\", function (e) { if (!isChoice(e.target)) { onFieldEvent(e); } });\n    el.form.addEventListener(\"change\", function (e) { if (isChoice(e.target)) { onFieldEvent(e); } });\n    el.form.addEventListener(\"keydown\", function (e) { if (e.key === \"Enter\" ? (e.target ? e.target.tagName === \"INPUT\" : false) : false) { e.preventDefault(); run(true); } });\n    el.calc.addEventListener(\"click\", function () { run(true); });\n    applyDefaults();\n    updateFactorUI(autoFactors(readInput()));\n  }\n  if (document.getElementById(\"flc-calculator\")) { init(); }\n  else if (document.readyState === \"loading\") { document.addEventListener(\"DOMContentLoaded\", init); }\n  else { init(); }\n})();\n<\/script>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>The Fatigue Limit Estimation Calculator is a practical online engineering tool designed to help mechanical engineers, material scientists, and manufacturing professionals estimate material endurance limits&#8230;<\/p>","protected":false},"author":2,"featured_media":24957,"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":[8752,8754,8755,8756,8753],"class_list":["post-24956","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-materials-science-and-properties","tag-endurance-strength","tag-fatigue-analysis","tag-fatigue-limit","tag-fatigue-safety-factor","tag-marin-factors","pmpro-has-access"],"acf":[],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/www.mechstream.com\/wp-content\/uploads\/2026\/10\/Fatigue-Limit-Estimation-Calculator.png","_links":{"self":[{"href":"https:\/\/www.mechstream.com\/fr\/wp-json\/wp\/v2\/posts\/24956","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=24956"}],"version-history":[{"count":1,"href":"https:\/\/www.mechstream.com\/fr\/wp-json\/wp\/v2\/posts\/24956\/revisions"}],"predecessor-version":[{"id":24958,"href":"https:\/\/www.mechstream.com\/fr\/wp-json\/wp\/v2\/posts\/24956\/revisions\/24958"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/fr\/wp-json\/wp\/v2\/media\/24957"}],"wp:attachment":[{"href":"https:\/\/www.mechstream.com\/fr\/wp-json\/wp\/v2\/media?parent=24956"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mechstream.com\/fr\/wp-json\/wp\/v2\/categories?post=24956"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mechstream.com\/fr\/wp-json\/wp\/v2\/tags?post=24956"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}