<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Nonlinear-Solvers on Robert Carson</title><link>https://robertcarson.org/tags/nonlinear-solvers/</link><description>Recent content in Nonlinear-Solvers on Robert Carson</description><generator>Hugo -- gohugo.io</generator><language>en</language><copyright>© 2026 Robert Carson</copyright><lastBuildDate>Tue, 15 Apr 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://robertcarson.org/tags/nonlinear-solvers/index.xml" rel="self" type="application/rss+xml"/><item><title>Building a Rust Scientific Computing Stack</title><link>https://robertcarson.org/projects/rust_projects/</link><pubDate>Tue, 15 Apr 2025 00:00:00 +0000</pubDate><guid>https://robertcarson.org/projects/rust_projects/</guid><description>&lt;h2 class="relative group"&gt;Why Rust
 &lt;div id="why-rust" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#why-rust" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;Before any specific library, some context on the language. The motivation was not ideological. It was practical and rooted in a specific kind of pain: Fortran code that compiles and runs without complaint, but quietly passes array shapes that do not match what the calling code believes they are. No runtime check, no compiler error, just wrong numbers. That class of silent bug had bitten me enough times that when a new language showed up that made memory safety a first-class guarantee enforced at compile time, it was worth learning seriously. Rust became the language I reached for when exploring new ideas or building tools where correctness under the surface mattered as much as correctness of output. Over time it also became a practical choice for building fast Python libraries through PyO3 bindings, since you get native execution speed with an interface that scientific users can drive from notebooks and scripts without knowing anything about Rust.&lt;/p&gt;</description><media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://robertcarson.org/projects/rust_projects/feature.jpg"/></item><item><title>SNLS: A Small Nonlinear Solver Library That Punches Above Its Weight</title><link>https://robertcarson.org/projects/snls/</link><pubDate>Tue, 15 Apr 2025 00:00:00 +0000</pubDate><guid>https://robertcarson.org/projects/snls/</guid><description>&lt;h2 class="relative group"&gt;Where It Started
 &lt;div id="where-it-started" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#where-it-started" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;SNLS predates both ExaCMech and ExaConstit. It was developed at LLNL specifically to solve the problem of running material model constitutive updates on the GPU, at a time when no existing nonlinear solver library was designed to do that. General-purpose solvers like MINPACK or PETSc are built for problems that live on the host. They carry significant overhead per call and are not structured for batched execution across millions of independent points simultaneously. In crystal plasticity specifically, every quadrature point in the mesh needs its own nonlinear solve to update stress and internal state at each time step, and those systems are dense, stiff, and need to run as fast as possible without any per-point failure being an option. That was the gap SNLS was built to fill.&lt;/p&gt;</description><media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://robertcarson.org/projects/snls/feature.png"/></item></channel></rss>