<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: NovaSolver</title>
    <description>The latest articles on DEV Community by NovaSolver (@01888927bd0e8aa92caca).</description>
    <link>https://dev.to/01888927bd0e8aa92caca</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3944450%2F57accb63-609f-4326-9282-a4dc4c58d556.PNG</url>
      <title>DEV Community: NovaSolver</title>
      <link>https://dev.to/01888927bd0e8aa92caca</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/01888927bd0e8aa92caca"/>
    <language>en</language>
    <item>
      <title>AM vs FM: What “Modulation Index” Actually Controls in a Radio Signal</title>
      <dc:creator>NovaSolver</dc:creator>
      <pubDate>Tue, 22 Sep 2026 12:17:02 +0000</pubDate>
      <link>https://dev.to/01888927bd0e8aa92caca/am-vs-fm-what-modulation-index-actually-controls-in-a-radio-signal-4n86</link>
      <guid>https://dev.to/01888927bd0e8aa92caca/am-vs-fm-what-modulation-index-actually-controls-in-a-radio-signal-4n86</guid>
      <description>&lt;h2&gt;
  
  
  The same word, two different physics
&lt;/h2&gt;

&lt;p&gt;Open any modulation tool and you'll find a slider called &lt;strong&gt;Modulation index&lt;/strong&gt;, sitting right next to &lt;strong&gt;Modulation type&lt;/strong&gt;, &lt;strong&gt;Carrier frequency f_c&lt;/strong&gt;, and &lt;strong&gt;Message frequency f_m&lt;/strong&gt;. It looks like one parameter. It isn't. Flip the modulation type from AM to FM and that slider silently starts controlling a completely different physical quantity, and the tool's &lt;strong&gt;Occupied bandwidth (Hz)&lt;/strong&gt; readout responds in a completely different way. If you've ever wondered why doubling the modulation index barely changes an AM spectrum but blows an FM spectrum wide open, this is why.&lt;/p&gt;

&lt;p&gt;This matters beyond academic curiosity. Every AM broadcast station is legally capped by an occupied-bandwidth limit, every FM station is engineered around Carson's rule, and both fail in the same visible way — audible distortion — for completely different underlying reasons. Understanding the split between the two modulation index definitions is the fastest way to stop guessing and start predicting spectrum behavior.&lt;/p&gt;

&lt;h2&gt;
  
  
  AM: riding the message on the carrier's amplitude
&lt;/h2&gt;

&lt;p&gt;Amplitude modulation multiplies the carrier's envelope by the message. For a single-tone message at frequency f_m modulating a carrier at f_c, the signal is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;s(t) = Ac * [1 + m * cos(2*pi*f_m*t)] * cos(2*pi*f_c*t)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here &lt;code&gt;m = Am / Ac&lt;/code&gt; is the modulation index — the ratio of the message amplitude to the carrier amplitude. It is dimensionless and, for a clean signal, must stay between 0 and 1.&lt;/p&gt;

&lt;p&gt;Multiply that expression out with a product-to-sum identity and you get three spectral lines: the carrier at f_c, and two sidebands at f_c + f_m and f_c − f_m. That's the entire spectrum for single-tone AM. The &lt;strong&gt;Occupied bandwidth (Hz)&lt;/strong&gt; is simply twice the message frequency:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;BW_AM = 2 * f_m
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice f_m alone sets the bandwidth. The modulation index doesn't appear in that formula at all — it controls how much power lives in the sidebands, not how wide they are. Push m past 1 and the envelope crosses zero and reverses phase; the detector can no longer trace the original message from the envelope, and the readout flags &lt;strong&gt;Overmodulation&lt;/strong&gt;. This is the single most common AM fault in the field: an over-driven audio input clipping the transmitter, not a hardware failure.&lt;/p&gt;

&lt;h2&gt;
  
  
  FM: riding the message on the carrier's frequency
&lt;/h2&gt;

&lt;p&gt;Frequency modulation keeps the amplitude constant and instead shifts the carrier's instantaneous frequency in proportion to the message:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;f_inst(t) = f_c + (delta_f) * cos(2*pi*f_m*t)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;where delta_f is the peak frequency deviation. In FM, the &lt;strong&gt;Modulation index&lt;/strong&gt; slider now represents the deviation ratio:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;beta = delta_f / f_m
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There is no amplitude to overdrive, so "overmodulation" in the AM sense doesn't apply — FM's failure mode is different (excessive bandwidth eating into adjacent channels), which is why a well-built simulator only raises that flag in AM mode.&lt;/p&gt;

&lt;p&gt;FM's spectrum isn't three lines; it's, in principle, infinite Bessel-function sidebands spaced f_m apart. In practice, almost all of that energy sits inside a band predicted by Carson's rule:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;BW_FM = 2 * (delta_f + f_m) = 2 * f_m * (beta + 1)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is where the two modulation types diverge sharply. In AM, cranking the index up to its maximum barely moves the bandwidth — it's fixed at 2*f_m regardless of m. In FM, cranking beta up directly and linearly expands the bandwidth. That's the whole reason FM broadcast needs 200 kHz channels while AM broadcast fits in 10 kHz: FM deliberately trades spectrum for noise immunity, and the modulation index is the dial that makes that trade.&lt;/p&gt;

&lt;h2&gt;
  
  
  A worked example: modulating a 5 kHz tone two ways
&lt;/h2&gt;

&lt;p&gt;Let's put real numbers through both formulas, using a message frequency f_m = 5 kHz throughout so the comparison is direct.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AM case.&lt;/strong&gt; Carrier frequency f_c = 1,000,000 Hz (1 MHz, a typical AM broadcast slot), message frequency f_m = 5,000 Hz, modulation index m = 0.7 (a healthy, non-clipping level).&lt;/p&gt;

&lt;p&gt;Occupied bandwidth:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;BW_AM = 2 * 5,000 Hz = 10,000 Hz
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Power efficiency — the fraction of total transmitted power that actually carries information, rather than being wasted holding up the unmodulated carrier — for single-tone AM is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;eta = m^2 / (2 + m^2)
    = 0.49 / 2.49
    = 0.197  -&amp;gt;  19.7%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So even at a healthy m = 0.7, over 80% of the transmitter's power is spent broadcasting a carrier that carries zero information. Push m to its legal maximum of 1.0 and efficiency only rises to 33.3% — AM's structural ceiling. That's the real reason AM stations sound duller than FM at the same power budget: most of the wattage is dead weight.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;FM case.&lt;/strong&gt; Same f_c and f_m, but now interpret the modulation index as a deviation ratio. Set beta = 5 (equivalent to a peak deviation delta_f = 25,000 Hz, a moderate value for narrowband-to-wideband FM):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;BW_FM = 2 * f_m * (beta + 1)
      = 2 * 5,000 * 6
      = 60,000 Hz
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Six times wider than the AM channel for the same message frequency — and FM doesn't have a power-efficiency penalty the way AM does, because FM signals are constant-envelope; essentially all transmitted power is "useful" in that sense. The trade is bandwidth for signal quality, not power for signal quality.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the bandwidth number comes from — and where it lies
&lt;/h2&gt;

&lt;p&gt;Carson's rule is an approximation that captures roughly 98% of FM signal power, not 100%. Push beta very low (narrowband FM, beta &amp;lt; 0.3) and Carson's rule converges toward BW = 2*f_m, which looks suspiciously like the AM formula — and for good reason, since narrowband FM and AM have structurally similar sideband spacing even though the physics generating them differs completely.&lt;/p&gt;

&lt;p&gt;Push beta very high and Carson's rule slightly underestimates the true occupied bandwidth, which is why real broadcast engineering leaves headroom above the Carson's-rule number rather than treating it as a hard ceiling.&lt;/p&gt;

&lt;p&gt;The practical pitfall engineers hit is comparing modulation index values across modes as if they meant the same thing. An "m = 5" in an AM system is nonsensical (it's deep into overmodulation territory, since AM is capped near 1); a "beta = 5" in FM is a completely ordinary, legal, well-behaved wideband signal. Always check &lt;strong&gt;Modulation type&lt;/strong&gt; before reading the index value.&lt;/p&gt;

&lt;p&gt;It's also worth noticing what stays fixed and what moves as you sweep &lt;strong&gt;Carrier frequency f_c&lt;/strong&gt;. Neither the AM nor the FM bandwidth formula depends on f_c at all — f_c only sets where the occupied band sits in the spectrum, not how wide it is. That's a common point of confusion for anyone new to the topic: raising the carrier frequency doesn't "compress" or "spread" the signal, it just relocates an unchanged-width band further up the dial. Channel spacing in a broadcast band is entirely a function of f_m and, for FM, beta — never of f_c itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  The narrowband FM edge case
&lt;/h2&gt;

&lt;p&gt;One more subtlety worth internalizing: at very low beta, narrowband FM's Carson bandwidth converges toward 2*f_m, numerically identical to the AM formula. That convergence isn't a coincidence of the approximation — at small deviation, the FM signal's sidebands genuinely collapse toward the same two-sideband structure AM produces, just generated by phase rather than amplitude variation. This is exactly why narrowband FM (used heavily in two-way radio) behaves, bandwidth-wise, almost like AM, while wideband FM (broadcast audio) behaves nothing like it. The &lt;strong&gt;Modulation index&lt;/strong&gt; slider is effectively a dial that walks a signal from "AM-like sideband structure" at one extreme to "wide, noise-resistant spread" at the other, and Carson's rule is what quantifies exactly where on that spectrum a given beta sits.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it yourself
&lt;/h2&gt;

&lt;p&gt;The fastest way to build intuition for this split is to watch the spectrum and the &lt;strong&gt;Occupied bandwidth (Hz)&lt;/strong&gt; readout move in real time as you change &lt;strong&gt;Modulation type&lt;/strong&gt; with the message frequency held fixed. Push the AM modulation index past 1.0 and watch the &lt;strong&gt;Overmodulation&lt;/strong&gt; flag trip while the bandwidth barely budges; switch to FM and watch the opposite happen.&lt;/p&gt;

&lt;p&gt;You can run both scenarios directly in the &lt;a href="https://novasolver.jp/en/tools/am-fm-modulation.html?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=en_devto_article" rel="noopener noreferrer"&gt;AM/FM Modulation Simulator&lt;/a&gt;. If you want to go further into the signal-processing side of the same family, the site's &lt;a href="https://novasolver.jp/en/tools/autocorrelation.html?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=en_devto_article" rel="noopener noreferrer"&gt;autocorrelation tool&lt;/a&gt; is a natural next stop for understanding how a receiver actually recovers f_m from a noisy demodulated signal.&lt;/p&gt;

</description>
      <category>engineering</category>
      <category>science</category>
      <category>am</category>
      <category>math</category>
    </item>
    <item>
      <title>Wing Flutter Speed: Where Bending and Torsion Modes Start Feeding Each Other</title>
      <dc:creator>NovaSolver</dc:creator>
      <pubDate>Tue, 22 Sep 2026 00:17:01 +0000</pubDate>
      <link>https://dev.to/01888927bd0e8aa92caca/wing-flutter-speed-where-bending-and-torsion-modes-start-feeding-each-other-1ep</link>
      <guid>https://dev.to/01888927bd0e8aa92caca/wing-flutter-speed-where-bending-and-torsion-modes-start-feeding-each-other-1ep</guid>
      <description>&lt;p&gt;Every wing bends a little and twists a little under aerodynamic load, and at low airspeed those two motions are essentially independent — the wing bends, the wing twists, and each settles back down on its own. Push the airspeed up far enough and something changes qualitatively: the bending motion starts feeding energy into the torsion motion and vice versa, through the aerodynamic forces that couple them, until one combined mode stops decaying and starts growing instead. That airspeed is the flutter speed, and above it a wing doesn't fail gradually — it diverges, often within a handful of cycles. This is why flutter analysis is treated as a hard certification boundary rather than a soft margin.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two degrees of freedom, one shared airflow
&lt;/h2&gt;

&lt;p&gt;The classical way to study this is the typical section model: a rigid airfoil section supported by a bending spring and a torsion spring, representing the wing's first bending mode and first torsion mode respectively. The geometry and structural properties that define the problem are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Chord length c&lt;/strong&gt; — sets the aerodynamic reference length (half-chord b = c/2 shows up throughout the theory)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bending frequency fh&lt;/strong&gt; and &lt;strong&gt;torsion frequency fθ&lt;/strong&gt; — the two structural natural frequencies being coupled&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Air density ρ&lt;/strong&gt; — scales the aerodynamic forces driving the coupling&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mass ratio μ = m/(πρb²)&lt;/strong&gt; — how heavy the section is relative to the air it displaces; low μ means the aerodynamics dominate the dynamics&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Radius of gyration rα&lt;/strong&gt; — how the section's mass is distributed about the torsion axis&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Eccentricity e/b&lt;/strong&gt; — the offset between the section's center of mass and its elastic axis, which is often the single most important parameter in the whole problem&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Unlike a lot of structural calculations, flutter doesn't reduce to a clean closed-form formula you can solve on paper. The equations of motion for the two coupled modes, driven by unsteady aerodynamic forces (captured through Theodorsen's function, which depends on the reduced frequency), form a complex eigenvalue problem. You sweep airspeed and, at each speed, find the frequency and damping of each aeroelastic mode. Flutter speed is the airspeed at which the damping of one of those modes crosses from positive (decaying) to negative (growing) — visualized as a V-g diagram, airspeed against modal damping.&lt;/p&gt;

&lt;h2&gt;
  
  
  The frequency ratio matters more than any single frequency
&lt;/h2&gt;

&lt;p&gt;Rather than fh or fθ individually, what drives flutter behavior is their ratio:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;frequency ratio = fh / fθ
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When this ratio is low — bending much softer than torsion — the modes tend to stay more separated in frequency at low airspeed, which generally raises the airspeed at which they converge and couple. As the ratio approaches 1, bending and torsion frequencies sit close together even before aerodynamic coupling kicks in, and flutter speed tends to drop sharply, because it takes much less aerodynamic coupling to merge two already-close frequencies into an unstable pair. This is one of the first things a flutter analysis checks, because a structural redesign that happens to nudge fh and fθ toward each other can quietly erode flutter margin even if every individual stiffness requirement still looks fine.&lt;/p&gt;

&lt;p&gt;Another output worth tracking alongside flutter speed is reduced frequency k = ωb/V, a dimensionless measure of how unsteady the airflow is relative to the section's motion. Low k (fast airflow relative to oscillation) behaves closer to quasi-steady aerodynamics; higher k means unsteady effects captured by Theodorsen's function dominate. The flutter condition typically emerges at a specific reduced frequency for a given configuration, and that value is itself an output of the coupled solution, not an input you choose.&lt;/p&gt;

&lt;h2&gt;
  
  
  A worked example
&lt;/h2&gt;

&lt;p&gt;Consider a wing section with a chord c of 1.2 m (half-chord b = 0.6 m), a bending frequency fh of 4 Hz, and a torsion frequency fθ of 10 Hz — a frequency ratio of 0.4, comfortably separated. Air density ρ is taken at sea level, 1.225 kg/m³. The section has a mass ratio μ of 40 (a moderately heavy section relative to the air it displaces), a radius of gyration rα of 0.5 (nondimensionalized by the half-chord), and an eccentricity e/b of 0.2 — meaning the center of mass sits 20% of the half-chord aft of the elastic axis, a destabilizing offset typical of a wing with some mass concentrated toward the trailing edge.&lt;/p&gt;

&lt;p&gt;Solving the coupled bending-torsion flutter determinant across a range of airspeeds for this configuration — which is what the simulator does numerically rather than through a hand formula — produces a V-g curve where the torsion-dominated mode's damping crosses zero around 90–100 m/s, giving a flutter speed Vf in that range. The divergence speed Vd, which is a purely static aeroelastic instability driven by torsional stiffness and the aerodynamic center offset rather than the dynamic coupling that drives flutter, typically comes out higher for a configuration like this, often 40–60% above Vf, meaning flutter is the governing limit rather than divergence for this particular geometry. At the flutter condition, the reduced frequency k typically lands somewhere around 0.2–0.3 for a mass ratio and eccentricity in this range — a useful cross-check, since a reported flutter point with an implausible reduced frequency (near zero or above 1) usually signals a setup error rather than a real result.&lt;/p&gt;

&lt;p&gt;The eccentricity e/b is worth isolating as a sensitivity check on its own: pushing the center of mass further aft of the elastic axis (larger e/b) generally lowers flutter speed noticeably, while moving it forward, toward or ahead of the elastic axis, raises it — which is exactly why mass-balancing control surfaces (adding weight ahead of the hinge line) is a standard flutter-prevention technique on ailerons and elevators.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common pitfalls
&lt;/h2&gt;

&lt;p&gt;The most frequent modeling error is treating flutter as if it scales simply with airspeed the way lift or drag does. It doesn't — the flutter boundary is the output of an eigenvalue problem, not an algebraic ratio, so intuition from static structural analysis (higher stiffness always helps) doesn't transfer cleanly. Increasing torsional stiffness generally raises flutter speed, but increasing bending stiffness without checking the frequency ratio can sometimes bring fh closer to fθ and lower flutter speed instead of raising it.&lt;/p&gt;

&lt;p&gt;A second pitfall is ignoring air density variation. Since flutter speed calculations are typically run at sea-level density for a conservative worst case, but flutter dynamic pressure (which scales with ρV²) is the more physically meaningful quantity at altitude — a wing can have a higher flutter speed at altitude in true airspeed terms while still being closer to its aerodynamic limit, because the relevant comparison is against the aircraft's actual dynamic pressure envelope, not airspeed alone.&lt;/p&gt;

&lt;p&gt;Finally, this two-degree-of-freedom typical section model is a simplification of a real wing's continuous mode shapes. It captures the essential physics correctly and is standard for preliminary design and for building intuition, but a full flutter clearance on an actual aircraft requires a much higher-fidelity structural and aerodynamic model with many coupled modes, not just the first bending and first torsion.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it yourself
&lt;/h2&gt;

&lt;p&gt;Solving the flutter determinant by hand across an airspeed sweep is not a five-minute exercise, which is exactly why this is a case where an interactive tool earns its keep over a spreadsheet. The &lt;a href="https://novasolver.jp/en/tools/aeroelasticity.html?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=en_devto_article" rel="noopener noreferrer"&gt;Aeroelastic Flutter Speed Calculator&lt;/a&gt; solves the coupled bending-torsion problem in real time as you adjust chord length, bending and torsion frequencies, mass ratio, radius of gyration, and eccentricity, and shows the V-g and V-omega diagrams directly so you can see the instability emerge rather than just reading off a single flutter speed number. If you're chasing the structural side of the same wing, the &lt;a href="https://novasolver.jp/en/tools/beam-deflection.html?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=en_devto_article" rel="noopener noreferrer"&gt;beam deflection tool&lt;/a&gt; is a useful companion for estimating the bending stiffness that feeds fh in the first place.&lt;/p&gt;

</description>
      <category>engineering</category>
      <category>science</category>
      <category>flutter</category>
      <category>structural</category>
    </item>
    <item>
      <title>From Oven Test to Field Life: Reading an Arrhenius Acceleration Factor Correctly</title>
      <dc:creator>NovaSolver</dc:creator>
      <pubDate>Mon, 21 Sep 2026 12:17:02 +0000</pubDate>
      <link>https://dev.to/01888927bd0e8aa92caca/from-oven-test-to-field-life-reading-an-arrhenius-acceleration-factor-correctly-3ngb</link>
      <guid>https://dev.to/01888927bd0e8aa92caca/from-oven-test-to-field-life-reading-an-arrhenius-acceleration-factor-correctly-3ngb</guid>
      <description>&lt;p&gt;Reliability engineers run parts hot on purpose. Baking a component at 85°C for a few weeks and watching it survive tells you almost nothing on its own — the number that matters is what that survival implies about life at the temperature the part will actually see in the field, usually somewhere around room temperature or a mild operating rise above it. The bridge between an accelerated test and a field life claim is the Arrhenius model, and getting the acceleration factor even slightly wrong can turn a legitimate qualification test into either an overly conservative design or a warranty problem three years down the line.&lt;/p&gt;

&lt;h2&gt;
  
  
  The chemistry behind the shortcut
&lt;/h2&gt;

&lt;p&gt;Most wear-out failure mechanisms in electronics and materials — dielectric breakdown, intermetallic growth, electromigration, polymer degradation — are thermally activated chemical or diffusion processes. Their rate follows the Arrhenius equation from chemical kinetics:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;rate(T) = A * exp(-Ea / (k * T))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;where T is absolute temperature in kelvin, k is Boltzmann's constant (8.617 × 10⁻⁵ eV/K), Ea is the activation energy of the dominant failure mechanism in electron-volts, and A is a mechanism-specific constant that cancels out once you take a ratio between two temperatures. That cancellation is the whole trick: you never need to know A, only the temperature gap and the activation energy.&lt;/p&gt;

&lt;h2&gt;
  
  
  The acceleration factor formula
&lt;/h2&gt;

&lt;p&gt;Taking the ratio of failure rates at two temperatures — a stress condition and a use condition — gives the acceleration factor directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AF = exp[ (Ea / k) * (1/Tu - 1/Ts) ]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here &lt;strong&gt;Stress temperature Ts&lt;/strong&gt; is the elevated test temperature, &lt;strong&gt;Use temperature Tu&lt;/strong&gt; is the field operating temperature, both in kelvin, and Ea is the activation energy for the failure mode being characterized. AF tells you how many times faster the failure mechanism proceeds at Ts compared to Tu. Once you have it, converting a test result to a field prediction is a single multiplication:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Use-condition life = Test life * AF
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;strong&gt;temperature gap&lt;/strong&gt; (Ts − Tu) is worth tracking on its own, because AF is extremely sensitive to it — the relationship is exponential, not linear, so a 10°C difference in how the gap is measured can move the acceleration factor by a large multiple, especially at low activation energies where the curve is flatter, or by an even larger one at high activation energies where it's steep.&lt;/p&gt;

&lt;h2&gt;
  
  
  A worked example
&lt;/h2&gt;

&lt;p&gt;Suppose a component is qualified at a stress temperature Ts of 85°C (358.15 K) against a use temperature Tu of 25°C (298.15 K), with an activation energy of 0.7 eV — a fairly typical value for several electronic wear-out mechanisms. The test runs for a test life of 500 hours without failure.&lt;/p&gt;

&lt;p&gt;First convert the temperatures to reciprocal kelvin:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1/Tu = 1/298.15 = 0.0033540 K⁻¹
1/Ts = 1/358.15 = 0.0027922 K⁻¹
difference = 0.0033540 - 0.0027922 = 0.0005618 K⁻¹
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then compute Ea/k:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Ea / k = 0.7 / 0.00008617 ≈ 8,124 K
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Multiply and exponentiate:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AF = exp(8,124 * 0.0005618) = exp(4.564) ≈ 95.9
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That acceleration factor — essentially the rate ratio between the reaction proceeding at the stress temperature versus the use temperature — says the failure mechanism runs about 96 times faster at 85°C than at 25°C. Applying it to the test result:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Use-condition life = 500 hours * 95.9 ≈ 47,950 hours
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's roughly 5.5 years of continuous field operation implied by a three-week oven test, with a temperature gap of 60°C driving nearly a hundredfold acceleration. It's a striking multiplier, and it's exactly why activation energy has to be justified rather than assumed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why activation energy is the number to argue about
&lt;/h2&gt;

&lt;p&gt;It helps to see how sharply the acceleration factor moves with Ea, holding the same 85°C-to-25°C temperature gap constant. At Ea = 0.4 eV, a value more typical of some moisture-diffusion-driven failure modes, the same temperature gap produces an acceleration factor of roughly 13.6 — meaning the 500-hour test would only support a use-condition life claim of about 6,800 hours, nowhere near the 47,950 hours calculated at 0.7 eV. Push Ea up to 1.0 eV, seen in some high-temperature intermetallic growth mechanisms, and the acceleration factor for the same temperature gap climbs to roughly 680, implying about 340,000 hours of field life from the identical three-week test. Three plausible activation energies, one identical test, and a use-condition life claim that spans nearly two orders of magnitude. This is precisely why component datasheets and qualification reports that quote a use-condition life without stating the activation energy they used should be treated with suspicion — the number is meaningless without it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this goes wrong in practice
&lt;/h2&gt;

&lt;p&gt;The single biggest source of error is treating activation energy as a fixed material constant when it's actually mechanism-specific and sometimes condition-dependent. A value of 0.7 eV might be well-supported for one failure mode — say, a particular electromigration pathway in a specific metallization — and completely wrong for a different mechanism in the same part, like a solder joint fatigue process that follows different kinetics entirely (often better modeled with Coffin-Manson rather than pure Arrhenius). Using a generic literature value without confirming it matches the failure mode actually observed during test is the most common qualification mistake.&lt;/p&gt;

&lt;p&gt;A second issue is extrapolating too far. The Arrhenius relationship assumes a single dominant mechanism across the entire temperature range being bridged. If the stress temperature is high enough to activate a different, faster-acting failure mode that wouldn't occur at the use temperature at all, the acceleration factor overstates field life, because the test is no longer measuring the same physics it's being used to predict. This is why qualification standards typically cap stress temperatures well below a part's absolute maximum rating — pushing Ts too high risks measuring the wrong failure mechanism entirely.&lt;/p&gt;

&lt;p&gt;A third, quieter mistake is forgetting that the temperature gap used in the calculation should reflect actual junction or hot-spot temperature, not ambient. A part rated for 25°C ambient can easily run at a use temperature 15–20°C higher internally under load, and plugging ambient into Tu instead of the real operating temperature silently inflates the acceleration factor and the resulting life claim.&lt;/p&gt;

&lt;p&gt;It also helps to keep a rough sense of where published activation energies tend to fall, if only to catch a typo or a unit mistake before it propagates through a report. Values below roughly 0.3 eV are unusually low for thermally-activated wear-out and often point to a mechanism that is not purely diffusion-driven, or to a measurement error. Values in the 0.4–0.7 eV range cover a wide swath of common electronic degradation mechanisms, including several corrosion and electromigration pathways. Values above 1.0 eV are typically associated with slower, higher-temperature-dominated mechanisms and produce very large acceleration factors even from a modest temperature gap, which is exactly when a sanity check against the observed failure mode matters most — a suspiciously large use-condition life claim is often the first sign that the wrong Ea was carried over from an unrelated part.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it yourself
&lt;/h2&gt;

&lt;p&gt;Running this by hand is manageable for one data point, but comparing activation energy assumptions, stress temperatures, or multiple test batches side by side is tedious to redo every time a new number comes in. The &lt;a href="https://novasolver.jp/en/tools/accelerated-life-arrhenius-model.html?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=en_devto_article" rel="noopener noreferrer"&gt;Accelerated Life Arrhenius Model Simulator&lt;/a&gt; takes stress temperature, use temperature, and test life directly and returns the acceleration factor, use-condition life, rate ratio, and temperature gap together, which makes it easy to see how sensitive a life claim is to the activation energy assumption before that number ends up in a qualification report. For related thermal-management questions on the same hardware, the &lt;a href="https://novasolver.jp/en/tools/heat-conduction-1d.html?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=en_devto_article" rel="noopener noreferrer"&gt;heat conduction tool&lt;/a&gt; is a natural next stop for estimating the actual junction temperature to plug in as Tu.&lt;/p&gt;

</description>
      <category>engineering</category>
      <category>science</category>
      <category>arrhenius</category>
      <category>thermal</category>
    </item>
    <item>
      <title>Sizing an AGV Fleet Without Guessing: A Throughput Model for Warehouse Floors</title>
      <dc:creator>NovaSolver</dc:creator>
      <pubDate>Mon, 21 Sep 2026 00:17:02 +0000</pubDate>
      <link>https://dev.to/01888927bd0e8aa92caca/sizing-an-agv-fleet-without-guessing-a-throughput-model-for-warehouse-floors-4jdl</link>
      <guid>https://dev.to/01888927bd0e8aa92caca/sizing-an-agv-fleet-without-guessing-a-throughput-model-for-warehouse-floors-4jdl</guid>
      <description>&lt;p&gt;A warehouse manager asked me once how many AGVs they actually needed for a new fulfillment floor. The honest answer was: it depends on things that don't show up on a floor plan — average travel distance per trip, how long each unit sits at a charger, and how many order lines get bundled onto a single run. Buy too few AGVs and pick rates crater during peak season. Buy too many and half the fleet sits idle burning capital. Getting the number right means modeling the fleet as a queueing system, not just dividing floor area by some rule of thumb.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually drives throughput
&lt;/h2&gt;

&lt;p&gt;An AGV or AMR fleet's output depends on a chain of variables that all feed into each other. Starting from the layout:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Warehouse type&lt;/strong&gt; — e-commerce fulfillment, manufacturing flow, cold storage, and cross-dock all have different travel patterns, pick densities, and dwell times, so the same floor area behaves differently depending on which one you pick&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Floor area&lt;/strong&gt; — bigger floors mean longer average travel per trip, all else equal&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AGV count&lt;/strong&gt; — the fleet size you're trying to size in the first place&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AGV average speed&lt;/strong&gt; — physical travel speed, usually capped well below a vehicle's max rating once you account for turns, congestion, and safety zones&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Picks per AGV per hour&lt;/strong&gt; — the pick-station side of the cycle, not just travel&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Charging time&lt;/strong&gt; and &lt;strong&gt;battery runtime&lt;/strong&gt; — together these set how much of a shift each unit is actually available versus parked at a charger&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lines per order&lt;/strong&gt; — how many separate pick locations a single order touches, which multiplies travel and handling per completed order&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The simulator combines these into a small set of results that map directly onto staffing and capital decisions: average travel distance, cycle time, per-AGV order rate, total fleet throughput, utilization, and AGV density relative to floor area.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building the model step by step
&lt;/h2&gt;

&lt;p&gt;Average travel distance in a random-destination warehouse scales with the square root of the floor area — this comes out of basic queueing-theory travel-distance approximations used for random storage layouts, and it's a useful mental model even before you touch a simulator: doubling floor area does not double travel distance, it scales it by roughly √2. Cycle time is travel time plus handling time at the pick face, and handling time itself scales with lines per order, since more pick stops per order means more start-stop cycles for the same trip.&lt;/p&gt;

&lt;p&gt;Per-AGV order rate falls straight out of cycle time: however many cycles a single AGV can complete per hour, divided by how many lines make up a typical order, gives orders completed per AGV per hour. Multiply that by fleet size and by lines per order again to get total items moved per hour, and you have total throughput. Utilization folds in the charging constraint — an AGV that has to leave the floor for a recharge stops contributing to throughput during that window, so effective fleet output is always somewhat below what a naive full-time calculation would suggest.&lt;/p&gt;

&lt;h2&gt;
  
  
  A worked example: sizing a fulfillment fleet
&lt;/h2&gt;

&lt;p&gt;Consider an e-commerce fulfillment floor of 8,000 m², running a fleet of 12 AGVs at an average speed of 1.2 m/s, with orders averaging 3 lines each, a charging time of 45 minutes, and a battery runtime of 5 hours between charges.&lt;/p&gt;

&lt;p&gt;Start with average travel distance. Using the square-root scaling above with a layout constant appropriate for a random-storage e-commerce floor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;avg travel distance ≈ 0.5 * sqrt(floor area)
                    = 0.5 * sqrt(8000)
                    ≈ 0.5 * 89.4 m ≈ 45 m
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Travel time per leg at 1.2 m/s is 45 / 1.2 ≈ 37.5 s. Add handling time at the pick face — pick, scan, and place overhead per line, times 3 lines — and a realistic cycle time comes out around 95 seconds per completed order.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;per-AGV orders/hr = 3600 s/hr / 95 s ≈ 37.9 cycles/hr
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Since each cycle here corresponds to one completed order (3 lines bundled into a single run), that's roughly 38 orders per AGV per hour before any charging losses. Across 12 AGVs, raw fleet throughput is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;38 orders/hr * 12 AGVs * 3 lines/order ≈ 1,368 items/hr
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now apply the charging constraint. With a 5-hour runtime and a 45-minute charge, each AGV's duty cycle is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;duty cycle = 5 / (5 + 0.75) ≈ 0.87
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So effective utilization sits around 87%, and realistic total throughput lands closer to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1,368 * 0.87 ≈ 1,190 items/hr
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finally, AGV density — a useful sanity check for whether the fleet is going to start colliding with itself — comes out to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;12 AGVs / 8,000 m² * 1,000 ≈ 1.5 AGV per 1,000 m²
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That density is comfortably below the point where most e-commerce floors start seeing congestion-driven slowdowns, which typically shows up above 3–4 AGV per 1,000 m² depending on aisle width and traffic control.&lt;/p&gt;

&lt;h2&gt;
  
  
  The pick-station side of the equation
&lt;/h2&gt;

&lt;p&gt;Everything above treats the pick face as instantaneous, but in practice &lt;strong&gt;picks per AGV per hour&lt;/strong&gt; is often the real ceiling, not travel speed. If a pick station can only process 40 picks per hour per lane because of a human picker or a fixed-cycle robotic arm, adding faster AGVs or shorter travel distances stops helping once the fleet's arrival rate at that station exceeds what it can process. Queuing at the pick face behaves the same way queuing at an intersection does: average wait time stays low right up until utilization crosses roughly 80%, then climbs steeply for any further increase in arrival rate. This is why a throughput model has to carry picks per AGV per hour as an independent constraint rather than assuming it always keeps pace with whatever the travel-time math suggests. In the worked example above, 38 order-cycles per AGV per hour is only achievable if the pick stations feeding that fleet can actually sustain that arrival rate without queuing — worth checking against the pick-station's own rated throughput before locking in a fleet size.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the simple math goes wrong
&lt;/h2&gt;

&lt;p&gt;The hand calculation above assumes every AGV is always productive between charges, which understates congestion. Once AGV density climbs, vehicles start queuing at intersections and pick stations, and cycle time stops being a fixed number — it grows with fleet size in a way that a linear model can't capture. This is exactly why fleet-sizing decisions benefit from a model that sweeps AGV count against floor area rather than picking one number and hoping. Adding more AGVs increases raw capacity but eventually erodes per-unit efficiency enough that total throughput plateaus, or even falls, while density and collision risk keep rising.&lt;/p&gt;

&lt;p&gt;A second trap is charging strategy. The example above assumes a single depleted-then-recharge cycle, but many real fleets use opportunistic charging at idle moments, which changes the effective duty cycle substantially. Warehouse type also matters more than it looks: cold storage floors typically run at lower average speeds due to traction and visibility constraints, and cross-dock operations have much shorter average travel distances but far higher pick frequency, so the same floor area and AGV count produce very different throughput numbers across warehouse types.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it yourself
&lt;/h2&gt;

&lt;p&gt;Hand math is fine for a rough cut, but comparing warehouse types, AGV counts, and charging strategies side by side is where a simulator earns its keep. The &lt;a href="https://novasolver.jp/en/tools/agvs-warehouse-traffic-throughput.html?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=en_devto_article" rel="noopener noreferrer"&gt;AGV/AMR Warehouse Traffic Throughput Simulator&lt;/a&gt; lets you dial in floor area, AGV count, speed, and charging parameters across all four warehouse types and see cycle time, utilization, and AGV density update together, which is a faster way to find the point where adding one more vehicle stops paying off. If your floor also involves manual tow-tractor traffic, the &lt;a href="https://novasolver.jp/en/tools/ackermann-steering.html?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=en_devto_article" rel="noopener noreferrer"&gt;Ackermann steering tool&lt;/a&gt; is a useful companion for turning-radius constraints in the same aisles.&lt;/p&gt;

</description>
      <category>engineering</category>
      <category>science</category>
      <category>agv</category>
      <category>mechanical</category>
    </item>
    <item>
      <title>Vibration Isolation from the Foundation Up: Base Excitation Transmissibility Explained</title>
      <dc:creator>NovaSolver</dc:creator>
      <pubDate>Sun, 20 Sep 2026 12:17:02 +0000</pubDate>
      <link>https://dev.to/01888927bd0e8aa92caca/vibration-isolation-from-the-foundation-up-base-excitation-transmissibility-explained-1j1h</link>
      <guid>https://dev.to/01888927bd0e8aa92caca/vibration-isolation-from-the-foundation-up-base-excitation-transmissibility-explained-1j1h</guid>
      <description>&lt;h2&gt;
  
  
  The problem: vibration coming through the floor
&lt;/h2&gt;

&lt;p&gt;Most vibration problems people picture involve a rotating machine shaking its own base. Base excitation is the mirror image of that: the floor is already moving, usually because of a nearby compressor, a forging press two bays over, or highway traffic under a building slab, and the question is how much of that motion reaches the sensitive equipment sitting on top of it. A microscope stage, a coordinate measuring machine, or a wafer stepper does not care whether the shaking originates locally or arrives through the foundation. It only cares about the amplitude it ends up seeing.&lt;/p&gt;

&lt;p&gt;The usual fix is a spring-damper isolator between the equipment and the floor: elastomer pads, coil springs, or an air spring table. Done correctly, the isolator can knock incoming vibration down by more than 95%. Done incorrectly, it can amplify the problem, because the same mount that isolates at high frequency acts as a mechanical amplifier near its own resonance. Getting this right is a matter of picking the isolator's natural frequency relative to the disturbance frequency, and that relationship is captured entirely in one dimensionless curve: the transmissibility function.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting up the model
&lt;/h2&gt;

&lt;p&gt;Treat the isolated equipment as a single mass sitting on a spring and damper, with the base of that spring-damper pair being driven by the floor's motion rather than a force applied directly to the mass. Four quantities define the whole problem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;System natural frequency fₙ&lt;/strong&gt; — set by the isolator's stiffness and the supported mass ( fₙ = (1/2π)·√(k/m) )&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Damping ratio ζ&lt;/strong&gt; — how much energy the isolator dissipates per cycle, typically 0.02–0.10 for steel springs and 0.05–0.15 for elastomer pads&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Excitation frequency f&lt;/strong&gt; — the dominant frequency of the floor motion you are trying to block&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Base vibration amplitude&lt;/strong&gt; — how much the floor itself is moving, in millimeters&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything downstream, including how much the equipment actually moves, falls out of the ratio between the excitation frequency and the isolator's natural frequency.&lt;/p&gt;

&lt;h2&gt;
  
  
  The transmissibility formula
&lt;/h2&gt;

&lt;p&gt;Define the frequency ratio first, since the rest of the analysis is written in terms of it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;r = f / fn
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Transmissibility, the fraction of base motion that reaches the mounted mass, is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;T = sqrt(1 + (2*zeta*r)^2) / sqrt((1 - r^2)^2 + (2*zeta*r)^2)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This single equation explains almost every practical observation about isolators. At r much less than 1 (excitation far below the isolator's natural frequency), T approaches 1 — the mount is rigid at that frequency and does nothing useful. At r = 1, the denominator's first term vanishes and T spikes toward a peak controlled almost entirely by damping; this is the resonance amplification everyone is warned about. Past r = √2, T finally drops below 1, and it keeps falling as r increases — this is the isolation region, and it is why isolator designers push the natural frequency as low as practical relative to the disturbance.&lt;/p&gt;

&lt;p&gt;The amplitude the equipment actually experiences is just the base amplitude scaled by T, and isolation efficiency is a more intuitive way to express the same number:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Isolation efficiency (%) = (1 - T) * 100
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  A worked example: isolating an instrument rack
&lt;/h2&gt;

&lt;p&gt;Suppose a floor near a stamping line vibrates at 25 Hz with an amplitude of 0.20 mm — measured with an accelerometer during a normal production shift. An instrument rack needs to sit near that floor, and the goal is to keep its residual motion low enough not to disturb a laser alignment stage on top of it.&lt;/p&gt;

&lt;p&gt;A soft elastomer isolator is selected with a natural frequency fₙ of 5 Hz and a damping ratio ζ of 0.05, typical for a medium-durometer pad carrying a moderate load.&lt;/p&gt;

&lt;p&gt;First, the frequency ratio:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;r = f / fn = 25 / 5 = 5.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That puts the system well into the isolation region (r &amp;gt; 1.414), which is the whole point of choosing a soft mount. Plugging into the transmissibility formula:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;numerator   = sqrt(1 + (2*0.05*5)^2) = sqrt(1 + 0.25) = 1.118
denominator = sqrt((1 - 25)^2 + 0.25) = sqrt(576 + 0.25) = 24.005
T = 1.118 / 24.005 ≈ 0.0466
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So only about 4.7% of the floor's motion reaches the rack. Isolation efficiency works out to roughly 95.3%, and the mounted-mass amplitude is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;0.20 mm * 0.0466 ≈ 0.0093 mm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is under 10 microns residual motion from a 200-micron input — a clean result for a laser stage. As a sanity check on how bad things would be without isolation, or if the isolator's natural frequency drifted up toward the excitation frequency, it is worth looking at the resonance amplification reference value: at r = 1 and ζ = 0.05, transmissibility spikes to roughly 10×. That is the fate of any isolator whose natural frequency is accidentally tuned close to the disturbance — a cheap rubber pad that seems fine at rest can turn into an amplifier once the floor starts shaking at the wrong frequency.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical guidance and common pitfalls
&lt;/h2&gt;

&lt;p&gt;The most common mistake is picking an isolator stiffness based only on static deflection under load, without checking where fₙ lands relative to the actual disturbance spectrum. A mount that looks soft enough on paper can still land its natural frequency inside the dominant excitation band once the real payload mass is accounted for, especially when equipment is added or removed later in its life.&lt;/p&gt;

&lt;p&gt;Damping is a double-edged parameter. More damping tames the resonance peak, which matters if the excitation frequency sweeps through fₙ during startup or shutdown, but too much damping degrades high-frequency isolation, because the (2ζr) term in the numerator grows with both ζ and r. For equipment that only ever sees a narrow, steady excitation band well above resonance, a lightly damped mount usually isolates better. For equipment that has to pass through resonance during a startup ramp, extra damping is worth the tradeoff.&lt;/p&gt;

&lt;p&gt;A second pitfall is ignoring multi-frequency floor spectra. Real floors rarely vibrate at one clean tone; a 25 Hz line frequency component might sit alongside a lower-frequency structural sway. An isolator tuned for one frequency can still transmit a troublesome amount of energy at another. It is worth running the transmissibility check at several candidate excitation frequencies, not just the dominant one, before committing to a stiffness.&lt;/p&gt;

&lt;p&gt;A third pitfall shows up with very low natural frequencies. Pushing fₙ down to improve isolation at a fixed excitation frequency means a softer spring, and a softer spring means more static deflection under the same supported weight. Below roughly 1–2 Hz, static deflection can become large enough that the equipment sits noticeably lower than intended, or that lateral stability becomes a problem — air springs and pneumatic isolators exist largely to get very low natural frequencies without the sag that a coil spring soft enough to match would produce. It is easy to chase a target transmissibility number on paper and end up specifying an isolator that is mechanically impractical to build.&lt;/p&gt;

&lt;p&gt;Finally, remember that the frequency ratio cuts both ways. If a facility upgrades its stamping line and the disturbance frequency shifts, r changes, and an isolator that used to sit safely at r = 5 could end up back near r = 1.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it yourself
&lt;/h2&gt;

&lt;p&gt;Running these numbers by hand is fine for a single check, but comparing several candidate isolators, or sweeping across a range of excitation frequencies to find the worst case, is much faster with a tool built for it. The &lt;a href="https://novasolver.jp/en/tools/base-excitation-transmissibility.html?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=en_devto_article" rel="noopener noreferrer"&gt;Base Excitation Transmissibility Simulator&lt;/a&gt; lets you adjust natural frequency, damping ratio, excitation frequency, and base amplitude directly and watch the frequency ratio, transmissibility, mounted-mass amplitude, and isolation verdict update in real time — useful for narrowing down a mount stiffness before it goes on an order form. If you are also chasing sensor-side effects on the same structure, the &lt;a href="https://novasolver.jp/en/tools/accelerometer-frequency-response.html?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=en_devto_article" rel="noopener noreferrer"&gt;accelerometer frequency response tool&lt;/a&gt; is a natural next stop.&lt;/p&gt;

</description>
      <category>engineering</category>
      <category>science</category>
      <category>vibration</category>
    </item>
    <item>
      <title>Sizing a Biogas Digester: The Mass Balance Behind Renewable Methane</title>
      <dc:creator>NovaSolver</dc:creator>
      <pubDate>Sun, 20 Sep 2026 00:17:02 +0000</pubDate>
      <link>https://dev.to/01888927bd0e8aa92caca/sizing-a-biogas-digester-the-mass-balance-behind-renewable-methane-2e9i</link>
      <guid>https://dev.to/01888927bd0e8aa92caca/sizing-a-biogas-digester-the-mass-balance-behind-renewable-methane-2e9i</guid>
      <description>&lt;h2&gt;
  
  
  Sizing a digester is a mass-balance problem before it's anything else
&lt;/h2&gt;

&lt;p&gt;Anaerobic digestion has a reputation for being a black-box biological process, but the sizing calculation that determines whether a plant is worth building is mostly straightforward mass balance, with the biology contributing exactly two numbers: how much biogas a given feedstock yields, and how fast the microbial population can process it. Get the mass balance right and you know your gas output, your power output, and whether your tank is big enough before you've committed to concrete. Get it wrong — usually by underestimating retention time or overestimating yield — and the plant either underperforms for its entire operating life or, worse, sours from organic overload.&lt;/p&gt;

&lt;h2&gt;
  
  
  Starting from the feedstock, not the tank
&lt;/h2&gt;

&lt;p&gt;The calculation starts with what you're actually feeding the digester: a &lt;strong&gt;Feedstock mass m&lt;/strong&gt; per day (tonnes of food waste, sewage sludge, or manure), of which only the &lt;strong&gt;Volatile solids VS&lt;/strong&gt; fraction is biologically degradable — the rest is water and inert material that passes through untouched. Multiplying feedstock mass by VS fraction gives the &lt;strong&gt;VS load (kg-VS/day)&lt;/strong&gt;, the quantity that everything downstream depends on. This single conversion is where a lot of back-of-envelope sizing estimates go wrong, because raw feedstock tonnage and VS load can differ by a factor of five or more depending on the source — dilute dairy manure might be 8-10% VS, while food waste can run 15-20% VS, and sewage sludge varies enormously depending on how it's been pre-thickened.&lt;/p&gt;

&lt;h2&gt;
  
  
  From VS load to gas
&lt;/h2&gt;

&lt;p&gt;Each unit of VS load converts to biogas at a rate set by the &lt;strong&gt;Specific biogas yield Y&lt;/strong&gt;, expressed in cubic meters of biogas per kg of VS destroyed — a number that depends heavily on feedstock composition (fats and proteins yield more biogas per kg VS than carbohydrates do, which is part of why co-digesting food waste with manure often boosts output beyond either substrate alone). Multiplying VS load by yield gives the &lt;strong&gt;Biogas output (m³/day)&lt;/strong&gt;. Of that biogas, only a fraction is methane, set by the &lt;strong&gt;Methane content&lt;/strong&gt; (typically 55-65% for most digesters, with the remainder mostly CO2 and trace H2S); multiplying through gives the &lt;strong&gt;Methane output (m³CH₄/day)&lt;/strong&gt; — the number that actually determines energy content, since CO2 in the biogas mixture doesn't burn.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;VS load        = Feedstock mass * VS fraction
Biogas output  = VS load * Specific biogas yield Y
CH4 output     = Biogas output * Methane content
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Turning methane into electricity
&lt;/h2&gt;

&lt;p&gt;Methane has a lower heating value of roughly 35.8 MJ/m³ at standard conditions. Run that through a combined heat and power (CHP) engine at a typical electrical efficiency of 35-40%, and you get the &lt;strong&gt;CHP electrical power (kWe)&lt;/strong&gt; — the number that ultimately determines project economics, since electricity (and sometimes waste heat, which most sizing tools don't credit separately) is what gets sold or offset.&lt;/p&gt;

&lt;h2&gt;
  
  
  A worked example
&lt;/h2&gt;

&lt;p&gt;Take a mid-sized digester processing food waste: &lt;strong&gt;Feedstock mass m&lt;/strong&gt; = 20 tonnes/day, &lt;strong&gt;Volatile solids VS&lt;/strong&gt; = 18%, &lt;strong&gt;Specific biogas yield Y&lt;/strong&gt; = 0.55 m³/kg-VS, &lt;strong&gt;Methane content&lt;/strong&gt; = 60%.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;VS load = 20,000 kg/day * 0.18 = 3,600 kg-VS/day
Biogas output = 3,600 * 0.55 = 1,980 m³/day
CH4 output = 1,980 * 0.60 = 1,188 m³CH4/day
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Converting methane volume to energy: 1,188 m³/day * 35.8 MJ/m³ ≈ 42,530 MJ/day, or about 492 kW of continuous thermal input (42,530 MJ ÷ 86,400 s). At 38% CHP electrical efficiency, that's roughly &lt;strong&gt;187 kWe&lt;/strong&gt; of continuous electrical output — enough, very roughly, for upward of 150 average households, though actual grid contribution depends on load-matching and uptime.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sizing the tank: where retention time and volume meet
&lt;/h2&gt;

&lt;p&gt;Gas yield tells you what comes out; it doesn't tell you how big the tank needs to be. That's set by the &lt;strong&gt;Required HRT&lt;/strong&gt; (hydraulic retention time — how many days feedstock needs to sit in the digester for the microbial community to substantially complete digestion, typically 15-30 days for mesophilic operation) combined with the daily feed volume, which together determine the minimum &lt;strong&gt;Digester volume V&lt;/strong&gt;. Divide VS load by digester volume and you get the &lt;strong&gt;Organic loading OLR (kg-VS/m³/day)&lt;/strong&gt; — arguably the single most important operational health check for a running digester, because push OLR too high for the available volume and retention time, and volatile fatty acids accumulate faster than the methanogenic bacteria can consume them, crashing pH and souring the whole tank (a failure mode that can take weeks to recover from once it happens).&lt;/p&gt;

&lt;p&gt;Continuing the example: at HRT = 25 days and a daily feed volume of roughly 20 m³/day (20 tonnes at close to water density), the required &lt;strong&gt;Digester volume V&lt;/strong&gt; works out to about 20 m³/day * 25 days = 500 m³. The resulting OLR is 3,600 kg-VS/day ÷ 500 m³ = 7.2 kg-VS/m³/day — on the high side for a single-stage mesophilic digester, where 3-5 kg-VS/m³/day is a more typical safe design target, and a flag that this particular sizing combination is running the risk of organic overload rather than comfortably within bounds.&lt;/p&gt;

&lt;h2&gt;
  
  
  Operating temperature and why it isn't free to change
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;Operating temperature T&lt;/strong&gt; sets which microbial regime you're running: mesophilic (around 35-38°C) is the default for most plants because the bacteria are relatively robust and the required HRT is manageable, while thermophilic operation (around 55°C) processes faster (shorter HRT for the same VS destruction) but is more sensitive to temperature swings and toxic buildup, and costs more to maintain. Raising operating temperature effectively lets you shrink the required digester volume for a given throughput, but that saved capital cost has to be weighed against the added heating energy and reduced process stability margin.&lt;/p&gt;

&lt;h2&gt;
  
  
  The climate accounting that often gets tacked on
&lt;/h2&gt;

&lt;p&gt;Beyond energy output, most modern feasibility studies also report &lt;strong&gt;CO₂ avoided (kg-CO₂/day)&lt;/strong&gt; — the emissions offset by displacing grid electricity (or, for manure-based digestion, the additional credit from capturing methane that would otherwise vent from open lagoon storage, since methane's global warming potential is roughly 28-30x CO2 over a 100-year horizon). This number matters commercially wherever carbon credits or renewable energy certificates factor into project financing, though it depends heavily on the carbon intensity of the grid being displaced and shouldn't be treated as a fixed constant across sites.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fixing the loading problem: volume, retention time, or both
&lt;/h2&gt;

&lt;p&gt;Once a design lands on an OLR that's too high for comfortable operation, there are really only two levers to pull, and they trade off directly against each other. Increasing &lt;strong&gt;Digester volume V&lt;/strong&gt; for the same daily feed lowers OLR proportionally, but tankage is the single largest capital cost in most digester projects, so oversizing has a real economic penalty. Alternatively, if &lt;strong&gt;Required HRT&lt;/strong&gt; can be shortened without hurting digestion completeness — typically by improving mixing, pre-treating the feedstock to break down particle size, or running at a slightly higher operating temperature — the same volume supports a higher throughput at a given target OLR. In practice, real designs usually split the difference: a somewhat larger tank than the bare economic minimum, combined with feedstock pre-treatment, rather than pushing either variable to its limit on its own. Revisiting the earlier example, dropping to a 20 kg-VS/m³/day-style loose sizing isn't realistic here, but going from 500 m³ to roughly 720 m³ (holding HRT at 25 days but adding a buffer) or extending HRT to about 36 days at the original 500 m³ would each bring OLR down into the comfortable 3-5 kg-VS/m³/day range, and the right choice between the two comes down to whether land and capital or biology and stability are the tighter constraint on a given site.&lt;/p&gt;

&lt;h2&gt;
  
  
  Co-digestion changes the yield number, not just the volume
&lt;/h2&gt;

&lt;p&gt;Digesters rarely run on a single feedstock in practice. Blending manure (low VS%, low biogas yield per kg-VS, but reliable and buffering) with a richer co-substrate like food waste or fats-oils-grease (high VS%, high &lt;strong&gt;Specific biogas yield Y&lt;/strong&gt;, but more prone to souring if overloaded on its own) is a common strategy precisely because it lets an operator push the blended &lt;strong&gt;Specific biogas yield Y&lt;/strong&gt; up without pushing the risk of volatile-fatty-acid buildup up by the same amount — the manure fraction supplies buffering capacity and trace nutrients that a food-waste-only feed often lacks. When comparing feedstock blends, it's worth recomputing VS load, biogas output, and OLR for the blend as a whole rather than assuming yields simply average, since the microbial community's tolerance for the richer component is usually the binding constraint, not the arithmetic mean of the two feedstocks' individual yields.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it yourself
&lt;/h2&gt;

&lt;p&gt;Sizing an anaerobic digester means chasing several interacting numbers at once — VS load, yield, retention time, loading rate — and it's easy to get one right while missing that another has quietly gone out of a safe operating range. &lt;a href="https://novasolver.jp/en/tools/anaerobic-digester-biogas.html?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=en_devto_article" rel="noopener noreferrer"&gt;Try the anaerobic digester biogas simulator here&lt;/a&gt; to sweep feedstock, temperature and retention time together and see OLR and CHP output update live. For a closer look at feedstock-specific yield curves, the &lt;a href="https://novasolver.jp/en/tools/anaerobic-digester-biogas-yield.html?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=en_devto_article" rel="noopener noreferrer"&gt;anaerobic digester biogas yield tool&lt;/a&gt; is a useful companion.&lt;/p&gt;

</description>
      <category>engineering</category>
      <category>science</category>
      <category>anaerobic</category>
      <category>energy</category>
    </item>
    <item>
      <title>Reading a Binary Phase Diagram: What the Lever Rule Actually Tells You</title>
      <dc:creator>NovaSolver</dc:creator>
      <pubDate>Sat, 19 Sep 2026 12:17:11 +0000</pubDate>
      <link>https://dev.to/01888927bd0e8aa92caca/reading-a-binary-phase-diagram-what-the-lever-rule-actually-tells-you-2de5</link>
      <guid>https://dev.to/01888927bd0e8aa92caca/reading-a-binary-phase-diagram-what-the-lever-rule-actually-tells-you-2de5</guid>
      <description>&lt;h2&gt;
  
  
  One diagram, two questions
&lt;/h2&gt;

&lt;p&gt;A binary phase diagram answers two questions at once for an alloy cooling from the melt: what phases are present at a given temperature, and how much of each. The first question is qualitative — read straight off the diagram by seeing which region a temperature-composition point falls into. The second question is quantitative, and it's where most students stop trusting their intuition and start reaching for the lever rule, because "how much liquid is left at 1350°C" isn't something you can eyeball reliably even when you can see the diagram clearly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building the diagram from two melting points
&lt;/h2&gt;

&lt;p&gt;An isomorphous binary system — the simple case, where the two components are fully soluble in each other in both solid and liquid states, like copper-nickel — is bounded by the two pure-component melting points: &lt;strong&gt;Component A melting point T_mA&lt;/strong&gt; and &lt;strong&gt;Component B melting point T_mB&lt;/strong&gt;. Between them sit two curves: the liquidus (above which everything is liquid) and the solidus (below which everything is solid). In between the two curves is the two-phase region, where liquid and solid coexist — and the width of that two-phase region, the gap between liquidus and solidus at a given composition, is controlled by what the tool calls the &lt;strong&gt;solidification-gap coefficient κ&lt;/strong&gt;, which governs how bowed apart the two curves are. A small κ gives a narrow two-phase region and rapid solidification over a narrow temperature window; a larger κ spreads solidification over a wider range, which matters practically because a wide mushy zone tends to promote more pronounced coring (compositional segregation within individual grains) during casting.&lt;/p&gt;

&lt;p&gt;For eutectic and peritectic systems, the diagram has a different shape — the liquidus curves slope down from each pure-component melting point to meet at an invariant point (the eutectic point, where liquid transforms directly to two solid phases at a fixed composition and temperature) rather than merging smoothly into a single solidus. The tool supports all three diagram types — isomorphous, eutectic, and peritectic — since the underlying lever-rule math for reading phase fractions at a given point is the same once you know which two phases bound the tie line, but the diagram topology, and therefore which regions exist at which compositions, differs.&lt;/p&gt;

&lt;h2&gt;
  
  
  The lever rule itself
&lt;/h2&gt;

&lt;p&gt;Pick an &lt;strong&gt;Alloy composition C₀ (mol%B)&lt;/strong&gt; and a &lt;strong&gt;Current temperature T (scrub)&lt;/strong&gt; that lands inside the two-phase region. Draw a horizontal tie line at that temperature; it intersects the solidus at the solid-phase composition and the liquidus at the liquid-phase composition. The lever rule says the fraction of each phase is inversely proportional to how far the overall composition sits from that phase's composition along the tie line — like a literal lever balanced at C₀, with the phase fractions acting as the weights needed at each end to balance it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;f_L    = (C_alpha - C_0) / (C_alpha - C_L)
f_alpha = (C_0 - C_L) / (C_alpha - C_L)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;where &lt;code&gt;f_L&lt;/code&gt; is liquid fraction, &lt;code&gt;f_alpha&lt;/code&gt; is solid fraction, &lt;code&gt;C_L&lt;/code&gt; is the liquid-phase composition read off the liquidus, and &lt;code&gt;C_alpha&lt;/code&gt; is the solid-phase composition read off the solidus, both at the current temperature. Note the fractions are weighted by the &lt;em&gt;opposite&lt;/em&gt; end of the tie line — this is the detail that trips people up on a first pass, since it feels backwards until you picture the literal lever-and-fulcrum analogy the rule is named after.&lt;/p&gt;

&lt;h2&gt;
  
  
  A worked example
&lt;/h2&gt;

&lt;p&gt;Take a copper-nickel-like isomorphous system with &lt;strong&gt;Component A melting point T_mA&lt;/strong&gt; = 1085°C (pure Cu) and &lt;strong&gt;Component B melting point T_mB&lt;/strong&gt; = 1455°C (pure Ni), an &lt;strong&gt;Alloy composition C₀&lt;/strong&gt; of 35 mol% Ni, and suppose at &lt;strong&gt;Current temperature T&lt;/strong&gt; = 1280°C the diagram (set by the chosen &lt;strong&gt;solidification-gap coefficient κ&lt;/strong&gt;) reports a liquidus composition &lt;strong&gt;C_L&lt;/strong&gt; = 28 mol% Ni and a solidus composition &lt;strong&gt;C_α&lt;/strong&gt; = 44 mol% Ni — meaning at this temperature, the liquid phase present is leaner in nickel than the bulk alloy, and the solid phase is richer in it, which is the expected direction since nickel has the higher melting point and preferentially partitions into the first solid to form.&lt;/p&gt;

&lt;p&gt;Applying the lever rule:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;f_L = (44 - 35) / (44 - 28) = 9 / 16 = 0.5625
f_alpha = (35 - 28) / (44 - 28) = 7 / 16 = 0.4375
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So at 1280°C this alloy is about 56% liquid and 44% solid by the lever-rule mass fractions — check: 0.5625 + 0.4375 = 1.0000, always a useful sanity check on a lever-rule result before trusting it. The tool reports this directly as &lt;strong&gt;Liquid Fraction f_L&lt;/strong&gt; and &lt;strong&gt;Solid Fraction f_α&lt;/strong&gt; alongside the &lt;strong&gt;Present Phase(s)&lt;/strong&gt; label and the &lt;strong&gt;Liquid-phase composition C_L&lt;/strong&gt; / &lt;strong&gt;Solid-phase composition C_α&lt;/strong&gt; values the fractions were computed from.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the coring problem is really a lever-rule problem in disguise
&lt;/h2&gt;

&lt;p&gt;Equilibrium cooling assumes solid-state diffusion has time to homogenize each grain's composition as it forms — an assumption that gets worse the faster you cool. Push the &lt;strong&gt;Cooling Rate&lt;/strong&gt; up and there isn't time for the first-formed, nickel-rich solid to re-equilibrate with the increasingly nickel-lean liquid around it, so each grain ends up with a composition gradient frozen in from the sequence of solid compositions it passed through during freezing (nickel-rich core, copper-rich rim) rather than the single uniform composition the equilibrium lever rule predicts. This is coring, and it's a direct, practical consequence of the same tie-line geometry the lever rule uses — a wider solidus-liquidus gap (larger κ) combined with a higher cooling rate produces worse coring, because there's more compositional range to freeze in and less time to erase it by diffusion.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the simple lever rule breaks down
&lt;/h2&gt;

&lt;p&gt;The lever rule as derived assumes complete mixing in the liquid and either complete or partial (Scheil-style, at the extreme) diffusion in the solid; real castings sit somewhere between the equilibrium lever rule and the no-diffusion-in-solid Scheil model depending on cooling rate and diffusivity, and matching a real casting's measured segregation to the equilibrium prediction alone will generally underestimate how cored the actual part is. It also assumes you've correctly identified which two phases bound the tie line — near an invariant point (eutectic or peritectic) in particular, the correct tie line changes character right at the boundary, and using the wrong one gives fractions that look plausible but are wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  Eutectic and peritectic systems: the lever rule doesn't change, the geometry does
&lt;/h2&gt;

&lt;p&gt;Everything above assumed an isomorphous system with one continuous two-phase region between a single liquidus and a single solidus. Eutectic systems complicate the picture by adding a second, structurally different two-phase region on each side of the eutectic composition — liquid coexisting with one of the two terminal solid solutions, rather than with a single continuously-varying solid. The lever rule still applies within each of those regions using exactly the same ratio-of-distances logic, but which two phases bound the tie line changes depending on which side of the eutectic point the &lt;strong&gt;Alloy composition C₀&lt;/strong&gt; sits on, and right at the eutectic temperature itself, three phases coexist at once (liquid plus both solid solutions), which is where the simple two-phase lever rule stops applying directly and a different bookkeeping — comparing the alloy composition against the eutectic composition and the two solid solubility limits — takes over instead. Peritectic systems add a similar complication at the peritectic point, where a liquid and one solid phase react on cooling to form a second, different solid phase. In both cases the practical takeaway is the same: read the &lt;strong&gt;Present Phase(s)&lt;/strong&gt; label the tool reports before trusting a lever-rule fraction, since the correct tie line — and therefore the correct C_L and C_α to plug in — depends on correctly identifying which two-phase field you're actually in.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the cooling rate slider is really telling you about casting quality
&lt;/h2&gt;

&lt;p&gt;Beyond just widening or narrowing predicted segregation, the interaction between &lt;strong&gt;solidification-gap coefficient κ&lt;/strong&gt; and &lt;strong&gt;Cooling Rate&lt;/strong&gt; maps fairly directly onto real foundry decisions. A casting process with inherently slow, controlled cooling — sand casting a large section, for instance — has more time for solid-state diffusion to smooth out the composition gradients the lever rule glosses over, so equilibrium lever-rule predictions track the actual as-cast structure reasonably well. A process with fast, uneven cooling — die casting, or the outer skin of a large ingot compared to its slow-cooling core — deviates further from the equilibrium picture, and as-cast coring in those regions can be severe enough that a post-cast homogenization heat treatment (holding well below the solidus for an extended time to let diffusion catch up) becomes a necessary processing step rather than an optional one. None of that changes the lever-rule arithmetic itself, but it's the reason the equilibrium diagram is treated as a starting point for alloy design rather than a literal prediction of what a fast-cooled casting will look like.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it yourself
&lt;/h2&gt;

&lt;p&gt;Reading a phase diagram is one skill; trusting a lever-rule fraction at an arbitrary scrubbed temperature is another, and it's much faster to build that intuition by dragging the temperature through the two-phase region than by redrawing tie lines by hand. &lt;a href="https://novasolver.jp/en/tools/binary-phase.html?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=en_devto_article" rel="noopener noreferrer"&gt;Try the binary phase diagram and lever rule calculator here&lt;/a&gt; across isomorphous, eutectic and peritectic systems. If wear and surface behavior in the solidified part matters for your application, the &lt;a href="https://novasolver.jp/en/tools/archard-wear.html?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=en_devto_article" rel="noopener noreferrer"&gt;Archard wear tool&lt;/a&gt; is a reasonable next stop.&lt;/p&gt;

</description>
      <category>engineering</category>
      <category>science</category>
      <category>lever</category>
      <category>materials</category>
    </item>
    <item>
      <title>Inside the Adam Optimizer: Why Deep Learning Training Actually Converges</title>
      <dc:creator>NovaSolver</dc:creator>
      <pubDate>Sat, 19 Sep 2026 00:17:02 +0000</pubDate>
      <link>https://dev.to/01888927bd0e8aa92caca/inside-the-adam-optimizer-why-deep-learning-training-actually-converges-3ij3</link>
      <guid>https://dev.to/01888927bd0e8aa92caca/inside-the-adam-optimizer-why-deep-learning-training-actually-converges-3ij3</guid>
      <description>&lt;h2&gt;
  
  
  Why plain gradient descent keeps failing on real loss surfaces
&lt;/h2&gt;

&lt;p&gt;Plain gradient descent moves every parameter by the same rule: step opposite the gradient, scaled by one global learning rate. That works nicely on a smooth, symmetric bowl. It works much less nicely on the loss surfaces that real neural networks actually produce, which tend to have narrow curved ravines running next to broad flat plateaus. Pick a learning rate large enough to make progress along the flat plateau and the optimizer oscillates wildly across the narrow ravine, sometimes diverging outright. Pick a learning rate small enough to stay stable in the ravine and progress across the plateau slows to a crawl.&lt;/p&gt;

&lt;p&gt;The fix that stuck, and the one nearly every modern training run defaults to, is Adam — Adaptive Moment Estimation. Instead of treating every parameter direction identically, Adam keeps two running statistics per parameter: a smoothed estimate of the gradient itself (the first moment, essentially momentum) and a smoothed estimate of the squared gradient (the second moment, which behaves like a per-parameter measure of how large or noisy that direction has been). Dividing one by the square root of the other gives each parameter its own effective step size, automatically compressed in directions that have been consistently steep and left larger in directions that have been quiet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two running averages instead of one gradient
&lt;/h2&gt;

&lt;p&gt;The core update, in the same form you'll find in the original paper, is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;m_t = beta1 * m_(t-1) + (1 - beta1) * g_t
v_t = beta2 * v_(t-1) + (1 - beta2) * g_t^2

m_hat_t = m_t / (1 - beta1^t)
v_hat_t = v_t / (1 - beta2^t)

theta_t = theta_(t-1) - alpha * m_hat_t / (sqrt(v_hat_t) + epsilon)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;g_t&lt;/code&gt; is the gradient of the loss with respect to the parameter at step t. &lt;code&gt;m_t&lt;/code&gt; is the exponential moving average of the gradient — this is the momentum term, and it's controlled by the &lt;strong&gt;first-moment decay β₁&lt;/strong&gt;, almost always set around 0.9, meaning roughly 90% of the previous momentum carries forward each step. &lt;code&gt;v_t&lt;/code&gt; is the exponential moving average of the squared gradient, controlled by the &lt;strong&gt;second-moment decay β₂&lt;/strong&gt;, almost always set close to 0.999 — much slower-moving than β₁ on purpose, because you want a stable read on "how noisy has this direction been" rather than a twitchy one. The &lt;strong&gt;learning rate α&lt;/strong&gt; then scales the whole normalized step.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bias correction: fixing the cold start
&lt;/h2&gt;

&lt;p&gt;Both &lt;code&gt;m&lt;/code&gt; and &lt;code&gt;v&lt;/code&gt; are initialized at zero, which means in the first few steps they're biased toward zero too — especially &lt;code&gt;v&lt;/code&gt;, since β₂ is close to 1 and takes a long time to accumulate real signal. Left uncorrected, this makes the very first updates artificially small or, worse, artificially large once you divide by an underestimated &lt;code&gt;v&lt;/code&gt;. The &lt;code&gt;m_hat&lt;/code&gt; and &lt;code&gt;v_hat&lt;/code&gt; terms divide by &lt;code&gt;(1 - beta^t)&lt;/code&gt;, which is close to zero when t is small and grows toward 1 as t increases, exactly canceling out the cold-start bias. By the time you're a few hundred steps in, &lt;code&gt;1 - beta1^t&lt;/code&gt; and &lt;code&gt;1 - beta2^t&lt;/code&gt; are both essentially 1, and the correction stops mattering.&lt;/p&gt;

&lt;h2&gt;
  
  
  Walking through the update by hand
&lt;/h2&gt;

&lt;p&gt;Numbers make this concrete faster than more algebra. Take a classic hard case for plain gradient descent: a narrow curved valley defined by&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;f(x, y) = (1 - x)^2 + 100 * (y - x^2)^2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;which has its minimum at (1, 1) with f = 0, and a floor that curves like a banana — exactly the kind of surface where a single global learning rate struggles. Start at (x, y) = (-1, 1), with &lt;strong&gt;learning rate α = 0.05&lt;/strong&gt;, &lt;strong&gt;β₁ = 0.9&lt;/strong&gt;, &lt;strong&gt;β₂ = 0.999&lt;/strong&gt;, ε = 1e-8.&lt;/p&gt;

&lt;p&gt;The gradient is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;df/dx = -2(1 - x) - 400*x*(y - x^2)
df/dy = 200*(y - x^2)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At (-1, 1): &lt;code&gt;1 - x = 2&lt;/code&gt;, so the first term is -4. &lt;code&gt;y - x^2 = 1 - 1 = 0&lt;/code&gt;, so the second term of df/dx is zero, and df/dy is also zero. So g0 = (-4, 0).&lt;/p&gt;

&lt;p&gt;Step 1: &lt;code&gt;m1 = 0.9*0 + 0.1*(-4, 0) = (-0.4, 0)&lt;/code&gt;. &lt;code&gt;v1 = 0.999*0 + 0.001*(16, 0) = (0.016, 0)&lt;/code&gt;. Bias-corrected: &lt;code&gt;m_hat1 = -0.4/0.1 = -4&lt;/code&gt;, &lt;code&gt;v_hat1 = 0.016/0.001 = 16&lt;/code&gt; for x (y-component stays 0 throughout since its gradient was zero). The x update is &lt;code&gt;-0.05 * (-4)/sqrt(16) = -0.05 * (-1) = +0.05&lt;/code&gt;, so &lt;code&gt;x&lt;/code&gt; moves from -1.00 to -0.95. That's a modest, controlled step even though the raw gradient magnitude was 4 — the adaptive scaling has already normalized it down to roughly one learning-rate unit, which is exactly the point: Adam's step size in any single direction is bounded near α regardless of how large the raw gradient is.&lt;/p&gt;

&lt;p&gt;Run this forward for a few hundred iterations — which is what the simulator does when you set &lt;strong&gt;Iterations&lt;/strong&gt; and press play — and the trajectory curls around the bottom of the valley and settles in. With these hyperparameters, a typical run reports a &lt;strong&gt;Final x&lt;/strong&gt; around 0.97–0.99, &lt;strong&gt;Final y&lt;/strong&gt; around 0.95–0.98, a &lt;strong&gt;Final loss f&lt;/strong&gt; on the order of 1e-3 to 1e-4, a &lt;strong&gt;Loss reduction (%)&lt;/strong&gt; north of 99.9%, and a &lt;strong&gt;Verdict&lt;/strong&gt; of "Converged."&lt;/p&gt;

&lt;h2&gt;
  
  
  What changes if you push the hyperparameters
&lt;/h2&gt;

&lt;p&gt;Push &lt;strong&gt;α&lt;/strong&gt; up to 0.2 on the same surface and the first few steps overshoot the valley floor and bounce between its walls before settling — still convergent, but visibly noisier in the trajectory plot. Push β₂ down toward 0.9 (closer to β₁) and the second-moment estimate becomes twitchy, reacting to every individual gradient spike instead of smoothing over the ravine's curvature, which reintroduces some of the oscillation Adam is supposed to remove. Push it up past 0.9999 and adaptation becomes so sluggish that early steps behave almost like plain momentum with no per-parameter scaling at all — useful on very smooth losses, actively harmful on ravines like this one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where engineers get the hyperparameters wrong
&lt;/h2&gt;

&lt;p&gt;The single most common mistake is treating α as if it needs re-tuning from scratch for every architecture. In practice, 1e-3 to 3e-4 is a reasonable starting point for the vast majority of deep-learning problems, and most of the useful tuning to do first is a learning-rate schedule (warmup then decay) rather than a different fixed value. The second mistake is dropping β₂ to "make training faster" — it does make training louder, not faster, since a noisier second moment gives you less reliable per-parameter scaling, not more useful gradient information. The third, subtler mistake is ignoring epsilon: on parameters where the gradient is consistently near zero, &lt;code&gt;v_hat&lt;/code&gt; can get small enough that epsilon (not the gradient) starts dominating the step size, which is usually fine at 1e-8 but can matter on mixed-precision training where you sometimes see it raised to 1e-6 or higher for numerical stability.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it yourself
&lt;/h2&gt;

&lt;p&gt;The best way to build intuition for how β₁ and β₂ trade off momentum against per-parameter caution is to watch it happen on a surface where a single learning rate visibly fails. The NovaSolver Adam Optimizer Simulator lets you pick the &lt;strong&gt;loss surface&lt;/strong&gt;, dial in α, β₁ and β₂, set the iteration count, and watch the trajectory converge (or not) toward the minimum, with the final position, loss, and convergence verdict reported live. &lt;a href="https://novasolver.jp/en/tools/adam-optimizer.html?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=en_devto_article" rel="noopener noreferrer"&gt;Try the Adam optimizer simulator here&lt;/a&gt; and compare it against the &lt;a href="https://novasolver.jp/en/tools/adaboost.html?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=en_devto_article" rel="noopener noreferrer"&gt;AdaBoost simulator&lt;/a&gt; if you want to see a completely different flavor of "adaptive" at work, or the &lt;a href="https://novasolver.jp/en/tools/batch-normalization.html?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=en_devto_article" rel="noopener noreferrer"&gt;batch normalization tool&lt;/a&gt; for the other half of why modern training actually converges in practice.&lt;/p&gt;

</description>
      <category>engineering</category>
      <category>science</category>
      <category>adam</category>
      <category>computing</category>
    </item>
    <item>
      <title>Dialing In an SLM Melt Pool: Power, Speed, and the Energy Density That Ties Them Together</title>
      <dc:creator>NovaSolver</dc:creator>
      <pubDate>Fri, 18 Sep 2026 12:17:02 +0000</pubDate>
      <link>https://dev.to/01888927bd0e8aa92caca/dialing-in-an-slm-melt-pool-power-speed-and-the-energy-density-that-ties-them-together-2apm</link>
      <guid>https://dev.to/01888927bd0e8aa92caca/dialing-in-an-slm-melt-pool-power-speed-and-the-energy-density-that-ties-them-together-2apm</guid>
      <description>&lt;h2&gt;
  
  
  One number that predicts most of your defects
&lt;/h2&gt;

&lt;p&gt;Selective laser melting (SLM), one flavor of metal powder-bed fusion, builds parts by scanning a focused laser across a thin layer of metal powder, melting a narrow track, then repeating layer after layer until a solid part emerges from what was loose powder. The process has four or five knobs that all interact — laser power, scan speed, hatch spacing, layer thickness — and getting any one of them wrong produces a specific, recognizable failure mode: lack-of-fusion porosity if there's too little energy, keyholing porosity if there's too much, or balling if the melt pool is unstable. The single number that ties the main knobs together and predicts which regime you're in is volumetric energy density, VED.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;VED (J/mm^3) = P / (v * h * t)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;where &lt;code&gt;P&lt;/code&gt; is &lt;strong&gt;Laser power P&lt;/strong&gt;, &lt;code&gt;v&lt;/code&gt; is &lt;strong&gt;Scan speed v&lt;/strong&gt;, &lt;code&gt;h&lt;/code&gt; is &lt;strong&gt;Hatch spacing h&lt;/strong&gt;, and &lt;code&gt;t&lt;/code&gt; is &lt;strong&gt;Layer thickness t&lt;/strong&gt;. The formula is simple division, but it captures the whole physical story: energy delivered per unit time (P), spread over the area the beam sweeps per unit time (v·h), deposited into a layer of given thickness (t). Everything about melt pool geometry and resulting part quality traces back to where this single ratio lands.&lt;/p&gt;

&lt;h2&gt;
  
  
  The parameters behind the ratio
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;AM process&lt;/strong&gt; and &lt;strong&gt;Powder material&lt;/strong&gt; set the material-side constants — thermal conductivity, absorptivity, melting point, and latent heat all differ meaningfully between, say, Ti-6Al-4V and 316L stainless, which means the same VED number does not mean the same thing across materials. &lt;strong&gt;Laser power P&lt;/strong&gt; is the most direct energy input, but it interacts with &lt;strong&gt;Beam diameter d&lt;/strong&gt;: the same wattage focused into a smaller spot produces far higher intensity (W/mm²) at the surface, which changes absorption behavior and can push the process from stable conduction-mode melting into keyhole-mode melting, where the beam vaporizes a narrow cavity into the melt pool rather than simply melting it. &lt;strong&gt;Scan speed v&lt;/strong&gt; and &lt;strong&gt;Hatch spacing h&lt;/strong&gt; together set how much of the powder bed area gets swept, and thus how much dwell time any given point receives. &lt;strong&gt;Layer thickness t&lt;/strong&gt; sets how much powder mass has to be melted through per pass, and it also interacts with &lt;strong&gt;Pre-heating temperature&lt;/strong&gt; — a hotter powder bed needs less laser energy to reach melting point, effectively shifting the whole process window toward lower power or higher speed for the same result.&lt;/p&gt;

&lt;h2&gt;
  
  
  Working through a build
&lt;/h2&gt;

&lt;p&gt;Take a Ti-6Al-4V build (a common &lt;strong&gt;Powder material&lt;/strong&gt; choice for aerospace brackets) with &lt;strong&gt;Laser power P&lt;/strong&gt; = 200 W, &lt;strong&gt;Scan speed v&lt;/strong&gt; = 900 mm/s, &lt;strong&gt;Hatch spacing h&lt;/strong&gt; = 0.10 mm, &lt;strong&gt;Layer thickness t&lt;/strong&gt; = 0.03 mm (30 μm, typical for fine-feature SLM), &lt;strong&gt;Beam diameter d&lt;/strong&gt; = 80 μm, and &lt;strong&gt;Pre-heating temperature&lt;/strong&gt; at 150 °C for the plate.&lt;/p&gt;

&lt;p&gt;First, raw VED:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;VED = 200 / (900 * 0.10 * 0.03) = 200 / 2.7 = 74.1 J/mm^3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This lands in the commonly cited stable-processing window for Ti-6Al-4V, which tends to sit roughly in the 50-100 J/mm³ range depending on the specific machine and powder lot — comfortably away from the lack-of-fusion regime below about 40 J/mm³ and the keyholing regime above roughly 120-150 J/mm³. The tool's &lt;strong&gt;Effective laser power (W)&lt;/strong&gt; output adjusts the nominal 200 W for the material's absorptivity at the laser wavelength (titanium alloys typically absorb 30-40% of a fiber laser's 1070 nm output, versus the lower absorptivity of highly reflective materials like copper or aluminum), which is why effective power is consistently reported below nominal power and is the more physically meaningful number for predicting actual melt pool size.&lt;/p&gt;

&lt;p&gt;From there, the tool's melt-pool geometry model — typically a variant of the Rosenthal moving point-source solution adapted for powder-bed conditions — produces a &lt;strong&gt;Melt-pool width (μm)&lt;/strong&gt; around 120-140 μm (roughly 1.5-1.75× the beam diameter, which is the normal ratio for a well-behaved conduction-mode pool) and a &lt;strong&gt;Melt-pool depth (μm)&lt;/strong&gt; around 60-80 μm. That depth needs to exceed layer thickness by a comfortable margin — here roughly double the 30 μm layer thickness — to guarantee the melt pool remelts a portion of the previously solidified layer beneath it, which is what actually fuses layers together metallurgically rather than just stacking them.&lt;/p&gt;

&lt;p&gt;Finally, &lt;strong&gt;Build rate (cm³/hr)&lt;/strong&gt; comes from the volume swept per unit time: scan speed times hatch spacing times layer thickness, scaled to a practical hourly rate and derated for the fraction of time actually spent scanning versus recoating and jumping between vectors — typically landing somewhere in the range of a few cm³/hr for fine-feature parameters like these. And with melt depth comfortably exceeding layer thickness and VED sitting mid-window, the tool's &lt;strong&gt;Porosity / defect risk&lt;/strong&gt; indicator should read low.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where builds actually go wrong
&lt;/h2&gt;

&lt;p&gt;The failure that catches people off guard is that VED alone does not fully determine outcome — two parameter sets with identical VED can produce very different melt pools, because VED is a ratio and division erases information. A build with double the power and double the scan speed has the same VED as the baseline but a much larger, faster-moving melt pool with different thermal gradients, different solidification microstructure, and different residual stress. VED is a useful screening number for staying inside a rough process window, not a substitute for checking melt-pool depth and width directly.&lt;/p&gt;

&lt;p&gt;The second common mistake is ignoring &lt;strong&gt;Pre-heating temperature&lt;/strong&gt; when troubleshooting cracking rather than porosity. Materials prone to solidification cracking under high thermal gradients — some nickel superalloys and certain aluminum alloys — often need substantial preheat (200 °C+, sometimes much higher on dedicated equipment) specifically to reduce the temperature gradient driving residual stress, independent of whatever VED value is already producing good melt-pool fusion. Treating preheat purely as an energy-density lever rather than a thermal-gradient lever misses why it's actually specified on a given machine.&lt;/p&gt;

&lt;p&gt;The third: chasing higher &lt;strong&gt;Build rate (cm³/hr)&lt;/strong&gt; by raising scan speed without re-checking melt-pool depth. It's easy to push speed up, keep VED nominally "in window" by also raising power, and not notice that beam diameter and hatch spacing haven't been re-balanced — producing lack-of-fusion porosity between hatch tracks even though the bulk VED number still looks fine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hatch spacing sets the overlap you cannot see in a VED number
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Hatch spacing h&lt;/strong&gt; deserves a closer look on its own, separate from its role inside the VED ratio, because it directly controls how much adjacent scan tracks overlap. If hatch spacing is set close to the melt-pool width itself, tracks barely touch and the boundary between them becomes a likely nucleation site for lack-of-fusion voids, even when the VED computed from power, speed, and layer thickness looks comfortably mid-window. Machine builders typically target an overlap ratio, meaning hatch spacing set to somewhere around 30 to 50 percent of melt-pool width, specifically so each new track remelts a meaningful strip of the previous one. This is also why doubling scan speed and hatch spacing together to chase build rate, while holding VED constant by also raising power, is a common way builds quietly drift out of a safe overlap ratio even though every number reported by a simple energy-density calculation still looks acceptable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it yourself
&lt;/h2&gt;

&lt;p&gt;Because laser power, scan speed, hatch spacing, and layer thickness all trade off against each other, it's much faster to explore the process window interactively than to hand-calculate every candidate parameter set. You can &lt;a href="https://novasolver.jp/en/tools/additive-manufacturing-laser-melt-pool.html?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=en_devto_article" rel="noopener noreferrer"&gt;try the melt pool simulator here&lt;/a&gt; and watch VED, melt-pool width and depth, and defect risk update together as you adjust power and speed. If your build is also sensitive to warping or residual stress, the &lt;a href="https://novasolver.jp/en/tools/additive-manufacturing-thermal-distortion.html?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=en_devto_article" rel="noopener noreferrer"&gt;thermal distortion tool&lt;/a&gt; covers the part-scale thermal side that melt-pool parameters alone don't capture.&lt;/p&gt;

</description>
      <category>engineering</category>
      <category>science</category>
      <category>slm</category>
      <category>manufacturing</category>
    </item>
    <item>
      <title>Reading an ABR Waveform: What Wave V Latency Actually Tells You</title>
      <dc:creator>NovaSolver</dc:creator>
      <pubDate>Fri, 18 Sep 2026 00:17:02 +0000</pubDate>
      <link>https://dev.to/01888927bd0e8aa92caca/reading-an-abr-waveform-what-wave-v-latency-actually-tells-you-40kg</link>
      <guid>https://dev.to/01888927bd0e8aa92caca/reading-an-abr-waveform-what-wave-v-latency-actually-tells-you-40kg</guid>
      <description>&lt;h2&gt;
  
  
  A signal buried in noise
&lt;/h2&gt;

&lt;p&gt;The auditory brainstem response (ABR) is one of the more elegant tricks in clinical neurophysiology: it measures electrical activity generated by the brainstem auditory pathway in direct response to a sound, using nothing but scalp electrodes. The catch is that the signal of interest — a few hundred nanovolts of neural response — is buried under EEG background activity that is often ten to a hundred times larger in amplitude. You cannot see a single ABR response in raw data. The entire test depends on repeating the same acoustic click thousands of times and averaging the recorded epochs together, because the neural response is time-locked to the stimulus while the background noise is not: average enough repetitions and the noise cancels toward zero while the true response accumulates.&lt;/p&gt;

&lt;p&gt;That averaging relationship is the mathematical heart of the test, and it's worth writing out explicitly because it explains almost every parameter on the test protocol:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SNR_gain (dB) = 10 * log10(N)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;where &lt;code&gt;N&lt;/code&gt; is &lt;strong&gt;Number of sweeps N&lt;/strong&gt;. Doubling the number of sweeps buys you about 3 dB of signal-to-noise improvement — a textbook square-root-of-N averaging relationship. This single formula is why ABR testing is a patience game: going from 1,000 to 4,000 sweeps only buys 6 dB, but that 6 dB is often the difference between a clean, readable waveform and a flat line you can't interpret.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the test protocol controls, and why
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Stimulus level&lt;/strong&gt; sets how loud the click is, typically expressed in dB nHL (normal hearing level) — this is the primary knob for actually testing hearing sensitivity, since the whole point of the exam in many cases is to find the lowest stimulus level that still produces a reliable Wave V. &lt;strong&gt;Click repetition rate&lt;/strong&gt; trades test speed against waveform quality: faster rates (70-90 clicks/sec) get you through more sweeps per minute but tend to smear and delay the later waveform components, especially in compromised auditory pathways, while slower rates (11-21/sec) produce cleaner, more classically-shaped waveforms at the cost of test time. &lt;strong&gt;Stimulus type&lt;/strong&gt; — typically a broadband click versus a tone burst — determines whether you're getting a fast, frequency-nonspecific overview of the pathway or a slower, frequency-specific threshold estimate. &lt;strong&gt;Patient condition&lt;/strong&gt; and &lt;strong&gt;Ipsilateral ear&lt;/strong&gt; describe who and what side you're actually measuring, which matters enormously because the underlying neural conduction times this test is measuring are sensitive to age, sedation state, and any conductive or sensorineural pathology already present.&lt;/p&gt;

&lt;p&gt;The five components of the waveform most clinicians care about are Wave I through Wave V, generated sequentially by the auditory nerve, cochlear nucleus, superior olivary complex, lateral lemniscus, and inferior colliculus respectively as the neural signal propagates up the brainstem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reading the output: a worked case
&lt;/h2&gt;

&lt;p&gt;Suppose you run the test on a healthy adult with &lt;strong&gt;Stimulus level&lt;/strong&gt; at 80 dB nHL, &lt;strong&gt;Click repetition rate&lt;/strong&gt; at 21.1/sec (a standard clinical default), &lt;strong&gt;Number of sweeps N&lt;/strong&gt; = 2,000, broadband click &lt;strong&gt;Stimulus type&lt;/strong&gt;, normal &lt;strong&gt;Patient condition&lt;/strong&gt;, testing the right ear as &lt;strong&gt;Ipsilateral ear&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;At 2,000 sweeps, &lt;strong&gt;SNR gain (dB)&lt;/strong&gt; works out to &lt;code&gt;10*log10(2000) ≈ 33 dB&lt;/code&gt; above the single-sweep noise floor — comfortably enough to resolve a clean five-peak waveform in a normal-hearing adult. The tool's simulated waveform should show &lt;strong&gt;Wave I latency (ms)&lt;/strong&gt; landing around 1.5-1.7 ms post-stimulus (the auditory nerve's near-field response, generated close to the cochlea so it arrives first), and &lt;strong&gt;Wave V latency (ms)&lt;/strong&gt; around 5.5-5.8 ms (the most robust and clinically relied-upon peak, generated near the inferior colliculus after several synaptic relays). Subtracting the two gives &lt;strong&gt;IPI I-V (ms)&lt;/strong&gt; — the interpeak interval — of roughly 4.0-4.2 ms, which represents central conduction time through the brainstem pathway independent of the peripheral (cochlear/nerve) portion of the system. This interpeak measure is diagnostically powerful precisely because it factors out conductive hearing loss and middle-ear effects, isolating brainstem conduction specifically.&lt;/p&gt;

&lt;p&gt;Now drop &lt;strong&gt;Stimulus level&lt;/strong&gt; to 30 dB nHL, simulating a search for threshold. Wave V latency should stretch out — typically by roughly 0.3-0.4 ms per 10 dB reduction near threshold — while Wave I often becomes too small to reliably identify at all, since the auditory nerve's compound action potential is more amplitude-sensitive to stimulus level than the more centrally-generated Wave V. Push stimulus level down further and Wave V itself eventually disappears into the noise floor; the lowest level at which it remains reliably identifiable is what the tool reports as &lt;strong&gt;Estimated threshold (dB nHL)&lt;/strong&gt;, and it typically correlates within about 10-15 dB of behavioral pure-tone thresholds in the 1-4 kHz range that click stimuli predominantly probe.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Test time (s)&lt;/strong&gt; is the practical cost of all this: at a 21.1/sec repetition rate, 2,000 sweeps takes roughly 95 seconds of raw stimulation time before accounting for rejected epochs (movement artifact, muscle noise) that have to be re-collected. Push repetition rate up to 90/sec and the same sweep count finishes in a quarter of the time — useful for screening, but often at the cost of Wave V amplitude and clarity in patients where waveform morphology, not just threshold, is the diagnostic question.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pitfalls that trip up interpretation
&lt;/h2&gt;

&lt;p&gt;The most common mistake is treating a prolonged &lt;strong&gt;Wave V latency (ms)&lt;/strong&gt; in isolation as evidence of a brainstem problem, when it's frequently just a symptom of reduced stimulus level reaching the cochlea — conductive hearing loss (fluid, wax, ossicular issues) delays and attenuates everything downstream without any brainstem pathology at all. The &lt;strong&gt;IPI I-V (ms)&lt;/strong&gt; interval is the actual tool for separating conductive/cochlear delay from true central conduction delay, and skipping straight to Wave V without checking Wave I is a recipe for false localization. The second pitfall is under-sampling: stopping at 500-1,000 sweeps because a waveform "looks readable" without checking that the SNR gain is actually sufficient for the stimulus level in use — near threshold, where the true response amplitude shrinks, the sweep count needed for a trustworthy peak identification goes up substantially, not down.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the ipsilateral side is not just bookkeeping
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;Ipsilateral ear&lt;/strong&gt; setting is easy to treat as a label rather than a parameter, but the ear being stimulated is the whole basis for the test in unilateral hearing evaluations. Bone-conducted and, to a lesser extent, loud air-conducted click stimuli can cross the skull and stimulate the opposite cochlea, a phenomenon audiologists call cross-hearing. When testing a patient with a significant asymmetry between ears, a response recorded while stimulating the poorer ear may actually be neural activity generated by the better, non-test ear picking up the crossed signal, producing a Wave V that looks like a false reassurance of hearing in the ear you are trying to characterize. This is exactly why clinical ABR protocols pair ipsilateral stimulus levels with masking noise delivered to the contralateral ear once the level gap between ears crosses roughly 40 dB, and why the identity of the stimulated ear has to be logged precisely alongside every waveform rather than assumed from context.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it yourself
&lt;/h2&gt;

&lt;p&gt;Watching how Wave I and Wave V latency, and the resulting interpeak interval, shift as you change stimulus level, repetition rate, and sweep count is a much faster way to build intuition than reading formulas. You can &lt;a href="https://novasolver.jp/en/tools/auditory-brainstem-response.html?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=en_devto_article" rel="noopener noreferrer"&gt;try the ABR simulator here&lt;/a&gt; to see the averaged waveform update in real time. For related signal-processing groundwork in biomedical instrumentation, the &lt;a href="https://novasolver.jp/en/tools/biomedical-signal.html?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=en_devto_article" rel="noopener noreferrer"&gt;biomedical signal tool&lt;/a&gt; covers adjacent filtering and averaging concepts.&lt;/p&gt;

</description>
      <category>engineering</category>
      <category>science</category>
      <category>auditory</category>
      <category>biomedical</category>
    </item>
    <item>
      <title>Model Reference Adaptive Control: Letting a Controller Learn the Plant</title>
      <dc:creator>NovaSolver</dc:creator>
      <pubDate>Thu, 17 Sep 2026 12:17:02 +0000</pubDate>
      <link>https://dev.to/01888927bd0e8aa92caca/model-reference-adaptive-control-letting-a-controller-learn-the-plant-5d6a</link>
      <guid>https://dev.to/01888927bd0e8aa92caca/model-reference-adaptive-control-letting-a-controller-learn-the-plant-5d6a</guid>
      <description>&lt;h2&gt;
  
  
  The problem MRAC is built to solve
&lt;/h2&gt;

&lt;p&gt;A fixed-gain PID controller is tuned for one plant, at one operating point, and it stays that way forever. If the plant's dynamics drift — a payload changes mass, an actuator wears, a chemical process fouls — the controller doesn't know, and performance degrades quietly until someone notices. Model Reference Adaptive Control (MRAC) takes a different approach: instead of tuning the controller once and hoping the plant stays put, it continuously adjusts the controller's own gains online, using the mismatch between the actual plant output and the output of an idealized reference model as the error signal that drives learning.&lt;/p&gt;

&lt;p&gt;The idea is elegant once you see it laid out. You pick a &lt;strong&gt;reference model&lt;/strong&gt; — essentially a first-order (or higher) system with the response you &lt;em&gt;wish&lt;/em&gt; your real plant had. You feed the same command into both the reference model and the real plant. Then you watch the gap between them. If the plant lags behind the reference, the adaptation law increases the controller gain; if it overshoots or leads, the law backs the gain off. Over time — assuming stability conditions are satisfied — the closed-loop plant output converges to track the reference model's output, even though the controller never had an exact model of the plant to begin with.&lt;/p&gt;

&lt;h2&gt;
  
  
  The four numbers that define the behavior
&lt;/h2&gt;

&lt;p&gt;The simple MRAC configuration reduces the whole design problem to a small set of parameters. &lt;strong&gt;Plant time constant τ_p&lt;/strong&gt; describes how sluggish or responsive the real, uncertain system is on its own — the quantity the adaptive law is implicitly trying to compensate for without ever measuring it directly. &lt;strong&gt;Reference model time constant τ_m&lt;/strong&gt; is the target dynamic you're asking the closed loop to match; make it faster than τ_p and you're demanding the adaptive controller do real work, make it close to τ_p and adaptation barely needs to engage. &lt;strong&gt;Adaptation gain γ&lt;/strong&gt; sets how aggressively the controller gains update in response to tracking error — too low and convergence crawls, too high and the loop starts hunting or oscillating before it settles. &lt;strong&gt;Disturbance level&lt;/strong&gt; is the wrench in the works: a persistent or random disturbance that the adaptive law has to reject on top of tracking the reference.&lt;/p&gt;

&lt;p&gt;The canonical adaptation law for this simplified first-order case is a gradient (MIT-rule-style) update:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight matlab"&gt;&lt;code&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;      &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;y_p&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;y_m&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;          &lt;span class="p"&gt;//&lt;/span&gt; &lt;span class="n"&gt;plant&lt;/span&gt; &lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="nb"&gt;minus&lt;/span&gt; &lt;span class="n"&gt;reference&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="n"&gt;output&lt;/span&gt;
&lt;span class="n"&gt;theta_dot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;gamma&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;phi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;    &lt;span class="p"&gt;//&lt;/span&gt; &lt;span class="n"&gt;adaptation&lt;/span&gt; &lt;span class="n"&gt;law&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;phi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;regressor&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;reference&lt;/span&gt; &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;      &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;theta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;           &lt;span class="p"&gt;//&lt;/span&gt; &lt;span class="n"&gt;adaptive&lt;/span&gt; &lt;span class="n"&gt;control&lt;/span&gt; &lt;span class="n"&gt;law&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;where &lt;code&gt;theta(t)&lt;/code&gt; is the time-varying controller gain being adapted, &lt;code&gt;r(t)&lt;/code&gt; is the reference command, and &lt;code&gt;gamma&lt;/code&gt; is exactly the &lt;strong&gt;Adaptation gain γ&lt;/strong&gt; slider. This is a simplified, illustrative form of the MIT rule; real MRAC implementations often substitute a Lyapunov-based update to guarantee stability, but the qualitative behavior — error drives gain change, gain change drives error down — is the same.&lt;/p&gt;

&lt;h2&gt;
  
  
  Watching it converge: a worked walkthrough
&lt;/h2&gt;

&lt;p&gt;Start with a plant that's slower than we'd like: &lt;strong&gt;Plant time constant τ_p&lt;/strong&gt; = 2.0 s, meaning left alone the system takes about 2 seconds to cover 63% of a step response. Set the &lt;strong&gt;Reference model time constant τ_m&lt;/strong&gt; = 0.5 s — we're asking the adaptive loop to make the plant behave four times faster than its native dynamics. Leave &lt;strong&gt;Disturbance level&lt;/strong&gt; at a modest constant offset, and set &lt;strong&gt;Adaptation gain γ&lt;/strong&gt; = 2.0 as a starting point.&lt;/p&gt;

&lt;p&gt;At t=0, the controller gain θ starts at some initial guess, probably too low to hit the faster reference model. The plant output y_p lags well behind y_m, producing a large early tracking error. Because e(t) is large, the adaptation law theta_dot = -γ·e·φ pushes θ up quickly — you'd see &lt;strong&gt;Adaptation progress&lt;/strong&gt; climb steeply over the first second or two of simulated time. As θ approaches the value that would make the closed loop match τ_m, e(t) shrinks, and the update slows down (adaptation is fundamentally proportional to how wrong you currently are). By around 4-6 seconds — roughly 8-12 times τ_m — the &lt;strong&gt;Steady tracking error (RMS)&lt;/strong&gt; typically settles to a small residual driven mostly by the disturbance rather than the tracking dynamics, and &lt;strong&gt;Adaptation settling time&lt;/strong&gt; lands somewhere in that same window.&lt;/p&gt;

&lt;p&gt;Now double the adaptation gain to γ = 4.0 with everything else fixed. Convergence starts faster — &lt;strong&gt;Adaptation settling time&lt;/strong&gt; drops — but push γ too far (try 10 or 15 in the tool) and you'll see &lt;strong&gt;Oscillation tendency&lt;/strong&gt; rise sharply: the gain update overshoots the value that matches the reference model, overcorrects, and the plant output starts ringing around the reference trajectory instead of settling onto it smoothly. This is the central tuning tension in every adaptive scheme built on a gradient law: γ trades convergence speed against robustness, and there is no free setting that maximizes both simultaneously.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the simple version runs out of guarantees
&lt;/h2&gt;

&lt;p&gt;The first-order, gradient-based MRAC shown here is intentionally simplified for intuition — real implementations carry two caveats worth knowing. First, gradient (MIT-rule) adaptation laws are not guaranteed globally stable the way Lyapunov-based adaptation laws are; for large reference amplitudes or fast reference model dynamics relative to the plant, a gradient law can in principle diverge even though it looks well-behaved for a given γ and τ combination. Second, real plants are rarely truly first-order and rarely free of high-frequency unmodeled dynamics; feeding an adaptive loop with high-frequency disturbance content is a classic way to trigger parameter drift, where θ wanders to increasingly extreme values chasing noise it can never actually track out. Production adaptive controllers typically add dead zones, projection, or leakage terms to the adaptation law specifically to guard against this — none of which is visible in the bare gradient law above, but all of which exist because the bare law fails without them in practice.&lt;/p&gt;

&lt;p&gt;The practical takeaway for anyone tuning a real adaptive loop: start with a conservative γ, confirm tracking error and adaptation progress behave sensibly at low disturbance, and only then push adaptation gain up while watching oscillation tendency as your early-warning signal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Disturbance level changes what convergence actually means
&lt;/h2&gt;

&lt;p&gt;It is easy to read &lt;strong&gt;Steady tracking error (RMS)&lt;/strong&gt; as a pure measure of how well the adaptation law learned the plant, but a nonzero disturbance level guarantees the error will never fully reach zero regardless of how well tuned gamma is. A constant disturbance shifts the operating point the controller has to hold against, and a first-order gradient adaptation law can only null out the portion of that offset that shows up correlated with its regressor signal; a random or high-frequency disturbance component is effectively unlearnable by a slow-updating gain and simply shows up as residual RMS error no matter how long the simulation runs. This distinction matters in practice: if steady tracking error stops improving despite increasing sweep time, adaptation gain, or both, the fix is not more aggressive tuning, it is recognizing that you have hit the disturbance floor for this control structure and would need a disturbance observer or an integral action term layered on top of the adaptive law to push further.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it yourself
&lt;/h2&gt;

&lt;p&gt;The cleanest way to build intuition for MRAC is to watch the plant output chase the reference model live while you move τ_p, τ_m, γ, and disturbance level independently. You can &lt;a href="https://novasolver.jp/en/tools/adaptive-control-mrac-simple.html?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=en_devto_article" rel="noopener noreferrer"&gt;try the MRAC simulator here&lt;/a&gt; and see exactly where the oscillation boundary sits for your own combination of parameters. If you're comparing adaptive control against a fixed-structure alternative, the &lt;a href="https://novasolver.jp/en/tools/anti-windup.html?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=en_devto_article" rel="noopener noreferrer"&gt;anti-windup tool&lt;/a&gt; is a useful contrast for how a non-adaptive controller handles actuator limits instead.&lt;/p&gt;

</description>
      <category>engineering</category>
      <category>science</category>
      <category>model</category>
      <category>controls</category>
    </item>
    <item>
      <title>Predicting Asphalt Rutting Before It Happens: The Jenkins Approach</title>
      <dc:creator>NovaSolver</dc:creator>
      <pubDate>Thu, 17 Sep 2026 00:17:02 +0000</pubDate>
      <link>https://dev.to/01888927bd0e8aa92caca/predicting-asphalt-rutting-before-it-happens-the-jenkins-approach-3ji2</link>
      <guid>https://dev.to/01888927bd0e8aa92caca/predicting-asphalt-rutting-before-it-happens-the-jenkins-approach-3ji2</guid>
      <description>&lt;h2&gt;
  
  
  Why rutting sneaks up on pavement engineers
&lt;/h2&gt;

&lt;p&gt;A new asphalt lane looks flat for years. Then, almost without warning, the wheel paths start to show as two shallow troughs running the length of the lane while the area between them and outside them stays level. That is rutting: the slow accumulation of permanent (non-recoverable) deformation every time a tire load passes. Each pass only contributes a few microns of unrecovered strain, so the process is invisible on any single truck's trip. It only becomes visible after hundreds of thousands or millions of load repetitions — which is exactly why it needs to be predicted at the design stage rather than diagnosed after the fact.&lt;/p&gt;

&lt;p&gt;Once rut depth crosses roughly 12 to 19 mm (the threshold varies by agency), water pools in the wheel paths during rain, hydroplaning risk climbs, and the pavement is usually flagged for a mill-and-overlay rehabilitation. Getting the mixture design and structural thickness right the first time is far cheaper than an early overlay, which is the entire reason empirical rutting models like the Jenkins formulation exist: they let you connect mix and traffic variables to a predicted rut-depth-versus-time curve before a single truck drives on the finished road.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually goes into the prediction
&lt;/h2&gt;

&lt;p&gt;The rut-depth calculator is built around inputs that a pavement engineer already controls or measures during mix design: &lt;strong&gt;Mixture type&lt;/strong&gt; and &lt;strong&gt;Aggregate gradation&lt;/strong&gt; set the internal friction and packing behavior of the aggregate skeleton, &lt;strong&gt;Surface thickness&lt;/strong&gt; and &lt;strong&gt;Binder content&lt;/strong&gt; determine how much asphalt mastic is available to flow under repeated shear, and &lt;strong&gt;Traffic ESAL&lt;/strong&gt; (equivalent single axle loads) captures how many damaging repetitions the pavement will see over its life. &lt;strong&gt;Pavement temperature&lt;/strong&gt; and &lt;strong&gt;Tire pressure&lt;/strong&gt; matter more than most non-specialists expect, because bitumen is a viscoelastic material — its stiffness drops sharply as temperature rises, and higher tire pressures concentrate the same axle load into a smaller, more intense contact patch. Finally, &lt;strong&gt;Design life&lt;/strong&gt; anchors the whole calculation to a time horizon so the output is a curve, not a single number.&lt;/p&gt;

&lt;p&gt;The empirical structure looks roughly like this, in the spirit of the LRRB 99-… line of research this style of model comes from:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;RD = a * (N)^b * TF
TF = f(pavement temperature)
N  = cumulative ESAL over the analysis period
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;where &lt;code&gt;RD&lt;/code&gt; is rut depth, &lt;code&gt;N&lt;/code&gt; is cumulative traffic in ESALs, &lt;code&gt;a&lt;/code&gt; and &lt;code&gt;b&lt;/code&gt; are regression coefficients tied to mixture type and gradation, and &lt;code&gt;TF&lt;/code&gt; is a temperature adjustment factor. The exponent &lt;code&gt;b&lt;/code&gt; is typically less than 1, which is the mathematically precise way of saying rutting grows quickly early in a pavement's life (as the mix densifies under traffic) and then decelerates — though it never fully stops, which is why design life still matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  A worked example
&lt;/h2&gt;

&lt;p&gt;Suppose you are checking a dense-graded surface mix, 90 mm thick, with a binder content of 5.2%, placed on a route carrying moderate truck traffic. You expect roughly 0.9 million ESALs per year, a design life of 15 years, an average summer pavement temperature of 45 °C in the top lift, and standard 700 kPa tire inflation.&lt;/p&gt;

&lt;p&gt;First, cumulative traffic:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Cumulative ESAL = 0.9e6 * 15 = 13.5e6  →  13.5 (×10^6)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, the temperature factor. At 45 °C the binder is well into its softer regime, so the calculator's &lt;strong&gt;Temp factor&lt;/strong&gt; comes out around 1.35 (a 35% amplification relative to the reference temperature of roughly 25 °C used in the base regression). Plugging cumulative ESAL and the temp factor through the mixture-specific coefficients for this gradation and binder content yields a &lt;strong&gt;Predicted rut depth (mm)&lt;/strong&gt; of about 9.8 mm at year 15.&lt;/p&gt;

&lt;p&gt;Compare that against an &lt;strong&gt;Allowable rut (mm)&lt;/strong&gt; threshold of 12 mm for this road classification, and the mix passes — but not by much. Running the same inputs forward a few more years (or bumping the traffic growth assumption from flat to 3%/year, which is more realistic for a growing corridor) pushes &lt;strong&gt;Predicted life (yr)&lt;/strong&gt; down to around 17-18 years before the allowable threshold is crossed, and the tool's &lt;strong&gt;Required overlay (cm)&lt;/strong&gt; output — the thickness needed to reset the clock at that point — comes out near 4 cm of mill-and-fill.&lt;/p&gt;

&lt;p&gt;The sensitivity worth noting: dropping surface thickness from 90 mm to 75 mm on the same mix roughly doubles the rate of rut accumulation, because the structural section carries proportionally more of the shear strain closer to the surface where temperatures (and therefore softening) are highest. Binder content has a similar but subtler effect — too little binder starves the mix and increases internal friction losses that show up as raveling rather than rutting, while too much creates a mix that shears plastically under exactly the kind of sustained high-temperature, high-tire-pressure loading this model is built to catch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the simple model breaks down
&lt;/h2&gt;

&lt;p&gt;This class of empirical model is calibrated against a specific range of mixtures, climates, and traffic conditions, and it shows its limits at the edges. Extremely stiff, polymer-modified binders used in some heavy-haul corridors rut less than the base regression predicts, because the coefficients were fit primarily against conventional binders. Extreme channelized traffic — ports, intersections with long queuing dwell times, bus rapid transit lanes where every vehicle tracks the same six inches of pavement — also concentrates load repetitions in a way that a network-average ESAL count underestimates. And because the temperature factor is usually derived from a single representative design temperature, a location with unusually long, hot summers (or a dark-colored, low-albedo surface that runs hotter than ambient) needs a locally calibrated temperature input rather than a textbook default.&lt;/p&gt;

&lt;p&gt;The other common mistake is treating &lt;strong&gt;Predicted life (yr)&lt;/strong&gt; as a hard cutoff rather than a threshold-crossing estimate. Real pavements don't fail on a schedule; they cross the allowable rut depth at whatever point actual traffic and actual temperatures diverge from the design assumptions. Treat the output as a planning horizon for scheduling inspections and budgeting overlays, not a guarantee.&lt;/p&gt;

&lt;h2&gt;
  
  
  Aggregate gradation deserves more attention than it gets
&lt;/h2&gt;

&lt;p&gt;It is worth dwelling on &lt;strong&gt;Aggregate gradation&lt;/strong&gt; specifically, because engineers reviewing a rutting report often focus on binder content and traffic while treating gradation as a fixed background variable. Rutting resistance in a dense-graded mix comes largely from stone-on-stone contact within the aggregate skeleton, not from the binder. A gap-graded or fine-heavy gradation relies more on mastic stiffness to resist shear, which makes it far more sensitive to the temperature factor than a coarse, well-interlocked gradation carrying load through direct aggregate contact. Two mixes with identical binder content and surface thickness can produce meaningfully different rut-depth curves purely because one gradation locks up under load and the other does not. When a predicted rut depth comes out worse than expected for a mix that otherwise looks conservative on paper, gradation is usually the first place to look before assuming the traffic or temperature inputs were wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it yourself
&lt;/h2&gt;

&lt;p&gt;If you're sizing a pavement section or checking whether an existing mixture design will hold up under updated traffic projections, it's faster to run the numbers than to eyeball them. You can &lt;a href="https://novasolver.jp/en/tools/asphalt-pavement-rut-depth-jenkins.html?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=en_devto_article" rel="noopener noreferrer"&gt;try the rut depth calculator here&lt;/a&gt; and adjust mixture type, thickness, and traffic directly to see how the predicted rut-depth curve shifts. If your project also involves subgrade or foundation checks, the &lt;a href="https://novasolver.jp/en/tools/beam-foundation-winkler.html?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=en_devto_article" rel="noopener noreferrer"&gt;Winkler beam-on-foundation tool&lt;/a&gt; is a natural companion for the structural side of the same design.&lt;/p&gt;

</description>
      <category>engineering</category>
      <category>science</category>
      <category>asphalt</category>
      <category>geotechnical</category>
    </item>
  </channel>
</rss>
