Skip to content

Commit 65a921e

Browse files
Replace EvalSol [1:end] .= broadcasts with copyto! across MIRK/FIRK/MIRKN
The `EvalSol.u[1:end] .= x` and `EvalSol.cache.k_discrete[1:end] .=` patterns create unnecessary SubArray views under @views. Using copyto! avoids the view allocation entirely. Applied to MIRK, FIRK, and MIRKN loss functions. Co-Authored-By: Chris Rackauckas <accounts@chrisrackauckas.com> Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 544fff2 commit 65a921e

3 files changed

Lines changed: 17 additions & 17 deletions

File tree

lib/BoundaryValueDiffEqFIRK/src/firk.jl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1337,7 +1337,7 @@ end
13371337
y_ = recursive_unflatten!(y, u)
13381338
resids = [get_tmp(r, u) for r in residual]
13391339
Φ!(resids[2:end], cache, y_, u, trait, constraint)
1340-
eval_sol.u[1:end] .= y_
1340+
copyto!(eval_sol.u, y_)
13411341
eval_bc_residual!(resids[1], pt, bc!, eval_sol, p, mesh)
13421342
recursive_flatten!(resid, resids)
13431343
return nothing
@@ -1350,7 +1350,7 @@ end
13501350
y_ = recursive_unflatten!(y, u)
13511351
resids = [r for r in residual]
13521352
Φ!(resids[2:end], cache, y_, u, trait, constraint)
1353-
eval_sol.u[1:end] .= y_
1353+
copyto!(eval_sol.u, y_)
13541354
eval_bc_residual!(resids[1], pt, bc!, eval_sol, p, mesh)
13551355
recursive_flatten!(resid, resids)
13561356
return nothing
@@ -1410,7 +1410,7 @@ end
14101410
u, p, y, pt::StandardBVProblem, bc::BC, mesh, cache, eval_sol, trait
14111411
) where {BC}
14121412
y_ = recursive_unflatten!(y, u)
1413-
eval_sol.u[1:end] .= y_
1413+
copyto!(eval_sol.u, y_)
14141414
resid_bc = eval_bc_residual(pt, bc, eval_sol, p, mesh)
14151415
resid_co = Φ(cache, y_, u, trait)
14161416
return vcat(resid_bc, mapreduce(vec, vcat, resid_co))

lib/BoundaryValueDiffEqMIRK/src/mirk.jl

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -441,8 +441,8 @@ end
441441
) where {BC}
442442
y_ = recursive_unflatten!(y, u)
443443
Φ!(residual[2:end], cache, y_, u, trait, constraint)
444-
EvalSol.u[1:end] .= __restructure_sol(y_, cache.in_size)
445-
EvalSol.cache.k_discrete[1:end] .= cache.k_discrete
444+
copyto!(EvalSol.u, __restructure_sol(y_, cache.in_size))
445+
copyto!(EvalSol.cache.k_discrete, cache.k_discrete)
446446
eval_bc_residual!(get_tmp(residual[1], u), pt, bc!, EvalSol, p, mesh)
447447
recursive_flatten!(resid, residual, u)
448448
return nothing
@@ -454,8 +454,8 @@ end
454454
) where {BC}
455455
y_ = recursive_unflatten!(y, u)
456456
Φ!(residual[2:end], cache, y_, u, trait, constraint)
457-
EvalSol.u[1:end] .= __restructure_sol(y_, cache.in_size)
458-
EvalSol.cache.k_discrete[1:end] .= cache.k_discrete
457+
copyto!(EvalSol.u, __restructure_sol(y_, cache.in_size))
458+
copyto!(EvalSol.cache.k_discrete, cache.k_discrete)
459459
eval_bc_residual!(residual[1], pt, bc!, EvalSol, p, mesh)
460460
recursive_flatten!(resid, residual)
461461
return nothing
@@ -515,8 +515,8 @@ end
515515
) where {BC}
516516
y_ = recursive_unflatten!(y, u)
517517
resid_co = Φ(cache, y_, u, trait)
518-
EvalSol.u[1:end] .= __restructure_sol(y_, cache.in_size)
519-
EvalSol.cache.k_discrete[1:end] .= cache.k_discrete
518+
copyto!(EvalSol.u, __restructure_sol(y_, cache.in_size))
519+
copyto!(EvalSol.cache.k_discrete, cache.k_discrete)
520520
resid_bc = eval_bc_residual(pt, bc, EvalSol, p, mesh)
521521
return vcat(resid_bc, mapreduce(vec, vcat, resid_co))
522522
end

lib/BoundaryValueDiffEqMIRKN/src/mirkn.jl

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -385,10 +385,10 @@ end
385385
y_ = recursive_unflatten!(y, u)
386386
resids = [get_tmp(r, u) for r in residual]
387387
Φ!(resids[3:end], cache, y_, u, p)
388-
EvalSol.u[1:end] .= __restructure_sol(y_[1:length(cache.mesh)], cache.in_size)
389-
EvalSol.cache.k_discrete[1:end] .= cache.k_discrete
390-
EvalDSol.u[1:end] .= __restructure_sol(y_[(length(cache.mesh) + 1):end], cache.in_size)
391-
EvalDSol.cache.k_discrete[1:end] .= cache.k_discrete
388+
copyto!(EvalSol.u, __restructure_sol(y_[1:length(cache.mesh)], cache.in_size))
389+
copyto!(EvalSol.cache.k_discrete, cache.k_discrete)
390+
copyto!(EvalDSol.u, __restructure_sol(y_[(length(cache.mesh) + 1):end], cache.in_size))
391+
copyto!(EvalDSol.cache.k_discrete, cache.k_discrete)
392392
eval_bc_residual!(resids[1:2], pt, bc, EvalSol, EvalDSol, p, mesh)
393393
recursive_flatten!(resid, resids)
394394
return nothing
@@ -400,10 +400,10 @@ end
400400
) where {BC}
401401
y_ = recursive_unflatten!(y, u)
402402
resid_co = Φ(cache, y_, u, p)
403-
EvalSol.u[1:end] .= __restructure_sol(y_[1:length(cache.mesh)], cache.in_size)
404-
EvalSol.cache.k_discrete[1:end] .= cache.k_discrete
405-
EvalDSol.u[1:end] .= __restructure_sol(y_[(length(cache.mesh) + 1):end], cache.in_size)
406-
EvalDSol.cache.k_discrete[1:end] .= cache.k_discrete
403+
copyto!(EvalSol.u, __restructure_sol(y_[1:length(cache.mesh)], cache.in_size))
404+
copyto!(EvalSol.cache.k_discrete, cache.k_discrete)
405+
copyto!(EvalDSol.u, __restructure_sol(y_[(length(cache.mesh) + 1):end], cache.in_size))
406+
copyto!(EvalDSol.cache.k_discrete, cache.k_discrete)
407407
resid_bc = eval_bc_residual(pt, bc, EvalSol, EvalDSol, p, mesh)
408408
return vcat(resid_bc, mapreduce(vec, vcat, resid_co))
409409
end

0 commit comments

Comments
 (0)