# NonlinearSolve.jl: Possible to store solution in-place of initial guess?

**URL:** <https://discourse.julialang.org/t/nonlinearsolve-jl-possible-to-store-solution-in-place-of-initial-guess/131208>\
**Category:** Numerics\
**Tags:** sciml, nonlinearsolve\
**Created:** [July 30, 2025, 3:09pm UTC](https://discourse.julialang.org/t/nonlinearsolve-jl-possible-to-store-solution-in-place-of-initial-guess/131208 "2025-07-30T15:09:11Z")\
**Posts on this page:** 17\
**Page:** 1

<div class="post-metadata">

**Author:** ![DanDoe](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dandoe/32/52717_2.png) [@DanDoe](https://discourse.julialang.org/u/DanDoe)\
**Post date:** [July 30, 2025, 3:09pm UTC](https://discourse.julialang.org/t/nonlinearsolve-jl-possible-to-store-solution-in-place-of-initial-guess/131208/1 "2025-07-30T15:09:11Z")

</div>

The standard workfllow to access the solution of a `nonlinear_eq = NonlinearProblem` is something like

`sol = SciMLBase.solve(nonlinear_eq, NewtonRaphson(autodiff = AutoFiniteDiff()));`

Is it possible to suppress the build-up of the `sol` object and have the solution written directly to the initial guess which is supplied in construction of the `NonlinearProblem`?

---

<div class="post-metadata">

**Author:** ![ChrisRackauckas](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/chrisrackauckas/32/77_2.png) [@ChrisRackauckas](https://discourse.julialang.org/u/ChrisRackauckas)\
**Post date:** [July 31, 2025, 1:59am UTC](https://discourse.julialang.org/t/nonlinearsolve-jl-possible-to-store-solution-in-place-of-initial-guess/131208/2 "2025-07-31T01:59:02Z")

</div>

`alias_u0 = true`, though we’re rolling out a whole aliasing system to simplify this, so that will be deprecated very soon for just a more comprehensive `verbose`

CC @jClugstor

---

<div class="post-metadata">

**Author:** ![DanDoe](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dandoe/32/52717_2.png) [@DanDoe](https://discourse.julialang.org/u/DanDoe)\
**Post date:** [July 31, 2025, 7:47am UTC](https://discourse.julialang.org/t/nonlinearsolve-jl-possible-to-store-solution-in-place-of-initial-guess/131208/3 "2025-07-31T07:47:42Z")

</div>

Thanks!

I was also wondering if there is a way to pre-allocate the `du` for in-place functions `f!(du, u, p)`

> **[Nonlinear Problems · NonlinearSolve.jl](https://docs.sciml.ai/NonlinearSolve/stable/basics/nonlinear_problem/#SciMLBase.NonlinearProblem)**
>
> Documentation for NonlinearSolve.jl.

I am calling the nonlinear solver from a hot loop, and would like to cut down allocations as far as possible.

---

<div class="post-metadata">

**Author:** ![ChrisRackauckas](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/chrisrackauckas/32/77_2.png) [@ChrisRackauckas](https://discourse.julialang.org/u/ChrisRackauckas)\
**Post date:** [July 31, 2025, 9:44am UTC](https://discourse.julialang.org/t/nonlinearsolve-jl-possible-to-store-solution-in-place-of-initial-guess/131208/4 "2025-07-31T09:44:36Z")

</div>

How big is your system? If it’s small, use static arrays and they all stack allocate with SimpleNonlinearSolve. If it’s big then these ones don’t matter: the Jacobian is O(n^2) vs these O(n). The general way to do the big ones would be to use the `cache = init(prob)` interface, though I’m cleaning that up a bit in order to get it documented so that might need to wait till over the weekend to have a fully non-allocating form.

---

<div class="post-metadata">

**Author:** ![DanDoe](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dandoe/32/52717_2.png) [@DanDoe](https://discourse.julialang.org/u/DanDoe)\
**Post date:** [August 1, 2025, 7:25am UTC](https://discourse.julialang.org/t/nonlinearsolve-jl-possible-to-store-solution-in-place-of-initial-guess/131208/5 "2025-08-01T07:25:31Z")

</div>

So eventually I would like to go to millions of unknowns, as I am trying to build a special IMEX-multirate integration scheme for Trixi.jl

Thanks, good to know! I was wondering how to go about this, since `NonlinearProblem` itself is immutable - which leads to me currently re-initializing it all the time despite only parameter and initial guess changes.

---

<div class="post-metadata">

**Author:** ![ChrisRackauckas](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/chrisrackauckas/32/77_2.png) [@ChrisRackauckas](https://discourse.julialang.org/u/ChrisRackauckas)\
**Post date:** [August 1, 2025, 1:38pm UTC](https://discourse.julialang.org/t/nonlinearsolve-jl-possible-to-store-solution-in-place-of-initial-guess/131208/6 "2025-08-01T13:38:40Z")

</div>

I put a reminder to respnnd here next week, hopefully i get this done and will post

---

<div class="post-metadata">

**Author:** ![DanDoe](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dandoe/32/52717_2.png) [@DanDoe](https://discourse.julialang.org/u/DanDoe)\
**Post date:** [August 8, 2025, 1:19pm UTC](https://discourse.julialang.org/t/nonlinearsolve-jl-possible-to-store-solution-in-place-of-initial-guess/131208/7 "2025-08-08T13:19:04Z")

</div>

I also played a bit with this, and managed to store the `NonlinearProblem` somewhere persistent, but I currently cannot avoid repeated `init` calls when the parameters `p` and/or the initial guess `u` changes. Is this expected?

---

<div class="post-metadata">

**Author:** ![Oscar\_Smith](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/oscar_smith/32/25343_2.png) [@Oscar\_Smith](https://discourse.julialang.org/u/Oscar_Smith)\
**Post date:** [August 8, 2025, 2:21pm UTC](https://discourse.julialang.org/t/nonlinearsolve-jl-possible-to-store-solution-in-place-of-initial-guess/131208/8 "2025-08-08T14:21:54Z")

</div>

why not use `reinit!`?

---

<div class="post-metadata">

**Author:** ![DanDoe](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dandoe/32/52717_2.png) [@DanDoe](https://discourse.julialang.org/u/DanDoe)\
**Post date:** [August 8, 2025, 3:06pm UTC](https://discourse.julialang.org/t/nonlinearsolve-jl-possible-to-store-solution-in-place-of-initial-guess/131208/9 "2025-08-08T15:06:58Z")

</div>

Ah nice, that helps! I somehow have not encountered documentation for `reinit!`, thanks!

The only remaining hurdle is that somehow the in-place property seems to be lost, i.e. after calling

```julia
SciMLBase.reinit!(integrator.nonlin_cache, integrator.k_nonlin)

```

I need to retrieve the solution as

```julia
sol = SciMLBase.solve!(integrator.nonlin_cache)
copyto!(integrator.k_nonlin, sol.u)

```

instead of just having it directly written in `integrator.k_nonlin`.

I initialize Problem and Cache as

```julia
nonlin_prob = NonlinearProblem{true}(stage_residual_midpoint!,
                                     k_nonlin, p)

nonlin_cache = SciMLBase.init(nonlin_prob,
                              NewtonRaphson(autodiff = AutoFiniteDiff());
                              # This works if I specify it directly in a `solve` call
                              alias = SciMLBase.NonlinearAliasSpecifier(alias_u0 = true))

```

---

<div class="post-metadata">

**Author:** ![Oscar\_Smith](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/oscar_smith/32/25343_2.png) [@Oscar\_Smith](https://discourse.julialang.org/u/Oscar_Smith)\
**Post date:** [August 8, 2025, 3:13pm UTC](https://discourse.julialang.org/t/nonlinearsolve-jl-possible-to-store-solution-in-place-of-initial-guess/131208/10 "2025-08-08T15:13:42Z")

</div>

I believe this is a bug that I fixed yesterday. Try updating packages (and let me know if that doesn’t fix it).

---

<div class="post-metadata">

**Author:** ![ChrisRackauckas](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/chrisrackauckas/32/77_2.png) [@ChrisRackauckas](https://discourse.julialang.org/u/ChrisRackauckas)\
**Post date:** [August 9, 2025, 3:37am UTC](https://discourse.julialang.org/t/nonlinearsolve-jl-possible-to-store-solution-in-place-of-initial-guess/131208/11 "2025-08-09T03:37:51Z")

</div>

Yes it is, that’s what I was alluding to 8 days ago 😅. I need to get docs for the iterator interface up yet before we really call this solved.

---

<div class="post-metadata">

**Author:** ![Oscar\_Smith](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/oscar_smith/32/25343_2.png) [@Oscar\_Smith](https://discourse.julialang.org/u/Oscar_Smith)\
**Post date:** [August 9, 2025, 3:59am UTC](https://discourse.julialang.org/t/nonlinearsolve-jl-possible-to-store-solution-in-place-of-initial-guess/131208/12 "2025-08-09T03:59:47Z")

</div>

my bugfix was insufficient. more fixes incoming.

---

<div class="post-metadata">

**Author:** ![DanDoe](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dandoe/32/52717_2.png) [@DanDoe](https://discourse.julialang.org/u/DanDoe)\
**Post date:** [August 11, 2025, 8:14am UTC](https://discourse.julialang.org/t/nonlinearsolve-jl-possible-to-store-solution-in-place-of-initial-guess/131208/13 "2025-08-11T08:14:39Z")

</div>

I think the reason is that `GeneralizedFirstOrderAlgorithmCache` does not have the field `alias_u0`, right?

> **[Update lib/NonlinearSolveFirstOrder/src/solve.jl ·...](https://github.com/SciML/NonlinearSolve.jl/commit/a68b55eff5d9b9b901bc261023c316ba7bd0ad1d)**
>
> High-performance and differentiation-enabled nonlinear solvers (Newton methods), bracketed rootfinding (bisection, Falsi), with sparsity and Newton-Krylov support. - Update lib/NonlinearSolveFirstOrder/src/solve.jl · SciML/NonlinearSolve.jl@a68b55e

---

<div class="post-metadata">

**Author:** ![ChrisRackauckas](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/chrisrackauckas/32/77_2.png) [@ChrisRackauckas](https://discourse.julialang.org/u/ChrisRackauckas)\
**Post date:** [August 11, 2025, 10:00am UTC](https://discourse.julialang.org/t/nonlinearsolve-jl-possible-to-store-solution-in-place-of-initial-guess/131208/14 "2025-08-11T10:00:57Z")

</div>

Everything should be using the general `alias` system now. Though it looks like @jClugstor you only handled the linear parts? [Use aliasing API for linear solves by jClugstor · Pull Request #533 · SciML/NonlinearSolve.jl · GitHub](https://github.com/SciML/NonlinearSolve.jl/pull/533)

---

<div class="post-metadata">

**Author:** ![DanDoe](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dandoe/32/52717_2.png) [@DanDoe](https://discourse.julialang.org/u/DanDoe)\
**Post date:** [August 11, 2025, 12:15pm UTC](https://discourse.julialang.org/t/nonlinearsolve-jl-possible-to-store-solution-in-place-of-initial-guess/131208/15 "2025-08-11T12:15:21Z")

</div>

Hm yeah, it looks like

```julia-auto
  SciMLBase.reinit!(integrator.nonlin_cache, integrator.k_nonlin;
                    # Added `alias` again here
                    alias = SciMLBase.NonlinearAliasSpecifier(alias_u0 = true))
  
  #println("inplace: ", SciMLBase.isinplace(integrator.nonlin_cache)) # true

  # These seems unfortunately also not to work, and gives different results than `reinit!`
  #SciMLBase.set_u!(integrator.nonlin_cache, integrator.k_nonlin)
  
  #sol = SciMLBase.solve!(integrator.nonlin_cache)
  #copyto!(integrator.k_nonlin, sol.u)

  # Does not write the results back to `integrator.k_nonlin`
  SciMLBase.solve!(integrator.nonlin_cache)

```

does still not what I want - although I would like to remark that the approach with writing out `sol` seems to allocate the same memory as the approach without writing into `sol` - so maybe I am fine with the current way.

---

<div class="post-metadata">

**Author:** ![jClugstor](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jclugstor/32/32689_2.png) [@jClugstor](https://discourse.julialang.org/u/jClugstor)\
**Post date:** [August 11, 2025, 2:57pm UTC](https://discourse.julialang.org/t/nonlinearsolve-jl-possible-to-store-solution-in-place-of-initial-guess/131208/16 "2025-08-11T14:57:30Z")

</div>

Nonlinear solves should be able to take a `NonlinearAliasSpecifier`, but the only option that works is `alias_u0`. The handling is in DiffEqBase  
[Use NonlinearAliasSpecifier for NonlinearProblem by jClugstor · Pull Request #1138 · SciML/DiffEqBase.jl · GitHub](https://github.com/SciML/DiffEqBase.jl/pull/1138), because of the way that the existing alias options work in NonlinearSolve.

---

<div class="post-metadata">

**Author:** ![DanDoe](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dandoe/32/52717_2.png) [@DanDoe](https://discourse.julialang.org/u/DanDoe)\
**Post date:** [August 19, 2025, 7:23am UTC](https://discourse.julialang.org/t/nonlinearsolve-jl-possible-to-store-solution-in-place-of-initial-guess/131208/17 "2025-08-19T07:23:49Z")

</div>

The aliasing seems now to work as expected! Thanks for your work! \<3
