CuArray(sol) for the solution of a SecondOrderODEProblem on CUDA arrays scalar-indexes the GPU arrays and errors under the default allowscalar(false). The solution's states are ArrayPartitions of CuArrays. The plain ODEProblem case (Array(sol) with CuArray states) works.
test/GPU/ode_gpu.jl was written for this (https://discourse.julialang.org/t/results-of-secondorderodeproblem-give-error-this-object-is-not-a-gpu-array/82100), but no test group ever included it. #659 wires it into the GPU group, and the self-hosted GPU job fails there: https://github.com/SciML/RecursiveArrayTools.jl/actions/runs/35874813098/job/107236637535
using CUDA, LinearAlgebra, OrdinaryDiffEq, Test
u0 = cu(rand(100)); du0 = cu(rand(100)); A = cu(randn(100, 100))
f(ddu, du, u, p, t) = mul!(ddu, A, u)
sol = solve(SecondOrderODEProblem(f, du0, u0, (0.0f0, 1.0f0)), Tsit5())
@test SciMLBase.successful_retcode(sol) # passes
CuArray(sol) # errors
Expression: size(CuArray(sol), 1) == 200
Scalar indexing is disallowed.
Invocation of getindex resulted in scalar indexing of a GPU array.
The failing versions are those resolved by that CI job: CUDA 6.4, OrdinaryDiffEq 7.8.1, RecursiveArrayTools master (4.5.2). Julia 1 is on the self-hosted GPU runner. I have not reproduced it locally because this machine has no GPU. A CPU substitute with JLArrays and allowscalar(false) did not reproduce it for JLArray(sol), so the scalar path may be specific to the CuArray constructor on AbstractVectorOfArray{<:Any,<:Any,<:ArrayPartition}.
#659 stays open as the regression test for this. Its test must not be weakened to make it pass.
🤖 Filed by Claude Code 2.1.280 (model claude-opus-5-5[1m]) from the qa-hygiene goal cycle.
https://claude.ai/code/session_01QgnmpexRwud38wrs3XvBfV
CuArray(sol)for the solution of aSecondOrderODEProblemon CUDA arrays scalar-indexes the GPU arrays and errors under the defaultallowscalar(false). The solution's states areArrayPartitions ofCuArrays. The plainODEProblemcase (Array(sol)withCuArraystates) works.test/GPU/ode_gpu.jlwas written for this (https://discourse.julialang.org/t/results-of-secondorderodeproblem-give-error-this-object-is-not-a-gpu-array/82100), but no test group ever included it. #659 wires it into the GPU group, and the self-hosted GPU job fails there: https://github.com/SciML/RecursiveArrayTools.jl/actions/runs/35874813098/job/107236637535The failing versions are those resolved by that CI job: CUDA 6.4, OrdinaryDiffEq 7.8.1, RecursiveArrayTools master (4.5.2). Julia 1 is on the self-hosted GPU runner. I have not reproduced it locally because this machine has no GPU. A CPU substitute with JLArrays and
allowscalar(false)did not reproduce it forJLArray(sol), so the scalar path may be specific to theCuArrayconstructor onAbstractVectorOfArray{<:Any,<:Any,<:ArrayPartition}.#659 stays open as the regression test for this. Its test must not be weakened to make it pass.
🤖 Filed by Claude Code 2.1.280 (model claude-opus-5-5[1m]) from the qa-hygiene goal cycle.
https://claude.ai/code/session_01QgnmpexRwud38wrs3XvBfV