Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion lib/OrdinaryDiffEqBDF/src/OrdinaryDiffEqBDF.jl
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,8 @@ import OrdinaryDiffEqCore: perform_step!, unwrap_alg,
get_fsalfirstlast, generic_solver_docstring, _fixup_ad,
_ode_interpolant, _ode_interpolant!, has_stiff_interpolation,
_ode_addsteps!, DerivativeOrderNotPossibleError, set_discontinuity,
DIRK, COEFFICIENT_MULTISTEP, isnewton, set_new_W!
DIRK, COEFFICIENT_MULTISTEP, isnewton, set_new_W!,
find_algebraic_vars_eqs
import SciMLBase: alg_order, isadaptive, _unwrap_val
import DiffEqBase: calculate_residuals, calculate_residuals!, initialize!
using OrdinaryDiffEqSDIRK: ESDIRKIMEXConstantCache, ESDIRKIMEXCache,
Expand Down
2 changes: 1 addition & 1 deletion lib/OrdinaryDiffEqBDF/src/bdf_caches.jl
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ function alg_cache(
atmp = similar(u, uEltypeNoUnits)
recursivefill!(atmp, false)
algebraic_vars = f.mass_matrix === I ? nothing :
[all(iszero, x) for x in eachcol(f.mass_matrix)]
find_algebraic_vars_eqs(f.mass_matrix)[1]

ie_tab = ImplicitEulerESDIRKIMEXTableau(
constvalue(uBottomEltypeNoUnits), constvalue(tTypeNoUnits)
Expand Down
26 changes: 25 additions & 1 deletion lib/OrdinaryDiffEqCore/ext/OrdinaryDiffEqCoreSparseArraysExt.jl
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
module OrdinaryDiffEqCoreSparseArraysExt

using SparseArrays: SparseMatrixCSC
import OrdinaryDiffEqCore: _isdiag
import OrdinaryDiffEqCore: _isdiag, find_algebraic_vars_eqs

# Efficient O(nnz) isdiag check for sparse matrices.
# Standard isdiag is O(n²) which is prohibitively slow for large sparse matrices.
Expand All @@ -22,4 +22,28 @@ function _isdiag(A::SparseMatrixCSC)
return true
end

"""
find_algebraic_vars_eqs(M::SparseMatrixCSC)

O(nnz) detection of algebraic variables (zero columns) and equations (zero rows).
"""
function find_algebraic_vars_eqs(M::SparseMatrixCSC)
n_cols = size(M, 2)
n_rows = size(M, 1)

algebraic_vars = fill(true, n_cols)
algebraic_eqs = fill(true, n_rows)

@inbounds for j in 1:n_cols
for idx in M.colptr[j]:(M.colptr[j + 1] - 1)
if !iszero(M.nzval[idx])
algebraic_vars[j] = false
algebraic_eqs[M.rowval[idx]] = false
end
end
end

return algebraic_vars, algebraic_eqs
end

end
4 changes: 2 additions & 2 deletions lib/OrdinaryDiffEqCore/src/OrdinaryDiffEqCore.jl
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import Logging: @logmsg, LogLevel

using MuladdMacro: @muladd

using LinearAlgebra: opnorm, I, UniformScaling, diag, isdiag
using LinearAlgebra: opnorm, I, UniformScaling, diag, isdiag, Diagonal

import PrecompileTools

Expand All @@ -37,7 +37,7 @@ import DiffEqBase: ODE_DEFAULT_NORM,
ODE_DEFAULT_UNSTABLE_CHECK,
DEVerbosity, _process_verbose_param

import SciMLOperators: MatrixOperator, FunctionOperator,
import SciMLOperators: AbstractSciMLOperator, MatrixOperator, FunctionOperator,
update_coefficients, update_coefficients!,
isconstant

Expand Down
24 changes: 24 additions & 0 deletions lib/OrdinaryDiffEqCore/src/misc_utils.jl
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,30 @@ end
# Sparse specialization is provided in OrdinaryDiffEqCoreSparseArraysExt
_isdiag(A::AbstractMatrix) = isdiag(A)

"""
find_algebraic_vars_eqs(M)

Find algebraic variables (zero columns) and algebraic equations (zero rows) from mass matrix.
Returns `(algebraic_vars, algebraic_eqs)` as boolean arrays (true = algebraic).

Works on CPU and GPU arrays. Sparse specialization (O(nnz)) is provided in
OrdinaryDiffEqCoreSparseArraysExt.
"""
function find_algebraic_vars_eqs(M::Diagonal)
_idxs = map(iszero, diag(M))
return _idxs, _idxs
end

function find_algebraic_vars_eqs(M::AbstractMatrix)
algebraic_vars = vec(all(iszero, M, dims = 1))
algebraic_eqs = vec(all(iszero, M, dims = 2))
return algebraic_vars, algebraic_eqs
end

function find_algebraic_vars_eqs(M::AbstractSciMLOperator)
return find_algebraic_vars_eqs(convert(AbstractMatrix, M))
end

isnewton(::Any) = false

# Extract the chunk size integer from an ADType for use as a type parameter.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using Test
using SparseArrays
using OrdinaryDiffEqNonlinearSolve: find_algebraic_vars_eqs
using OrdinaryDiffEqCore: find_algebraic_vars_eqs
using LinearAlgebra

@testset "Sparse Algebraic Detection Performance" begin
# Test 1: Correctness - results should match between sparse and dense methods
Expand Down Expand Up @@ -88,4 +89,14 @@ using OrdinaryDiffEqNonlinearSolve: find_algebraic_vars_eqs
@test vars == [false, true]
@test eqs == [false, true]
end

# Test 4: Test Diagonal case
@testset "Test Diagonal cast" begin
M_diag = Diagonal([1.0, 0.0, 1.0, 1.0, 0.0])
vars, eqs = find_algebraic_vars_eqs(M_diag)
@test vars == [false, true, false, false, true]
@test eqs == [false, true, false, false, true]
# compare to dense
@test find_algebraic_vars_eqs(M_diag) == find_algebraic_vars_eqs(collect(M_diag))
end
end
1 change: 1 addition & 0 deletions lib/OrdinaryDiffEqCore/test/runtests.jl
Original file line number Diff line number Diff line change
Expand Up @@ -33,5 +33,6 @@ end
# Functional tests
if TEST_GROUP == "Core" || TEST_GROUP == "ALL"
@time @safetestset "Sparse isdiag Performance" include("sparse_isdiag_tests.jl")
@time @safetestset "Algebraic Vars Detection" include("algebraic_vars_detection_tests.jl")
@time @safetestset "Discontinuity Detection" include("disco_tests.jl")
end
10 changes: 8 additions & 2 deletions lib/OrdinaryDiffEqDifferentiation/src/derivative_utils.jl
Original file line number Diff line number Diff line change
Expand Up @@ -184,7 +184,7 @@ function calc_tderivative!(integrator, cache, dtd1, repeat_step)
tf.p = p
alg = unwrap_alg(integrator, true)

autodiff_alg = ADTypes.dense_ad(gpu_safe_autodiff(alg_autodiff(alg), u))
autodiff_alg = gpu_safe_autodiff(ADTypes.dense_ad(alg_autodiff(alg)), u)

# Convert t to eltype(dT) if using ForwardDiff, to make FunctionWrappers work
t = autodiff_alg isa AutoForwardDiff ? convert(eltype(dT), t) : t
Expand Down Expand Up @@ -229,7 +229,7 @@ function calc_tderivative(integrator, cache)
tf.u = uprev
tf.p = p

autodiff_alg = ADTypes.dense_ad(gpu_safe_autodiff(alg_autodiff(alg), u))
autodiff_alg = gpu_safe_autodiff(ADTypes.dense_ad(alg_autodiff(alg)), u)

if alg_autodiff isa AutoFiniteDiff
autodiff_alg = SciMLBase.@set autodiff_alg.dir = diffdir(integrator)
Expand Down Expand Up @@ -573,6 +573,12 @@ function jacobian2W!(
else
@.. broadcast = false @view(W[idxs]) = muladd(λ, invdtgamma, @view(J[idxs]))
end
elseif is_sparse(W) && !ArrayInterface.fast_scalar_indexing(nonzeros(W))
# Sparse GPU arrays (e.g. CuSparseMatrixCSC/CSR) don't support broadcasting.
# ArrayInterface.fast_scalar_indexing is not specialized for AbstractGPUSparseArray,
# so we detect them by checking if the underlying nonzeros storage is a GPU array.
# we then fall back to allocating matrix arithmetic
copyto!(W, J - invdtgamma * mass_matrix)
else
@.. broadcast = false W = muladd(-mass_matrix, invdtgamma, J)
end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,8 @@ using OrdinaryDiffEqCore: resize_nlsolver!, _initialize_dae!,
Convergence,
Divergence, NLStatus,
MethodType, error_constant,
alg_extrapolates, resize_J_W!, alg_autodiff
alg_extrapolates, resize_J_W!, alg_autodiff,
find_algebraic_vars_eqs

import OrdinaryDiffEqCore: _initialize_dae!,
isnewton, get_W, isfirstcall, isfirststage,
Expand Down
43 changes: 0 additions & 43 deletions lib/OrdinaryDiffEqNonlinearSolve/src/initialize_dae.jl
Original file line number Diff line number Diff line change
@@ -1,46 +1,3 @@
# Efficient algebraic variable/equation detection for sparse mass matrices.
# O(nnz) instead of O(n²) for sparse matrices.
"""
find_algebraic_vars_eqs(M::SparseMatrixCSC)

Find algebraic variables (zero columns) and algebraic equations (zero rows) from mass matrix.
Returns (algebraic_vars::Vector{Bool}, algebraic_eqs::Vector{Bool}).

For sparse matrices, uses O(nnz) traversal of CSC structure instead of O(n²) iteration.
"""
function find_algebraic_vars_eqs(M::SparseMatrixCSC)
n_cols = size(M, 2)
n_rows = size(M, 1)

# Initialize all as algebraic (true = zero column/row)
algebraic_vars = fill(true, n_cols)
algebraic_eqs = fill(true, n_rows)

# Mark columns/rows with non-zero values as differential (false)
@inbounds for j in 1:n_cols
for idx in M.colptr[j]:(M.colptr[j + 1] - 1)
if !iszero(M.nzval[idx])
algebraic_vars[j] = false
algebraic_eqs[M.rowval[idx]] = false
end
end
end

return algebraic_vars, algebraic_eqs
end

# Fallback for non-sparse matrices (original behavior)
function find_algebraic_vars_eqs(M::AbstractMatrix)
algebraic_vars = vec(all(iszero, M, dims = 1))
algebraic_eqs = vec(all(iszero, M, dims = 2))
return algebraic_vars, algebraic_eqs
end

# Handle SciMLOperators (e.g., MatrixOperator) by converting to matrix
function find_algebraic_vars_eqs(M::AbstractSciMLOperator)
return find_algebraic_vars_eqs(convert(AbstractMatrix, M))
end

# Optimized tolerance checking that avoids allocations
@inline function check_dae_tolerance(integrator, err, abstol, t, ::Val{true})
if abstol isa Number
Expand Down
1 change: 0 additions & 1 deletion lib/OrdinaryDiffEqNonlinearSolve/test/runtests.jl
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ end
# Run functional tests
if TEST_GROUP ∉ ("QA", "ModelingToolkit")
@time @safetestset "Newton Tests" include("newton_tests.jl")
@time @safetestset "Sparse Algebraic Detection" include("sparse_algebraic_detection_tests.jl")
@time @safetestset "Sparse DAE Initialization" include("sparse_dae_initialization_tests.jl")
@time @safetestset "Linear Nonlinear Solver Tests" include("linear_nonlinear_tests.jl")
@time @safetestset "Linear Solver Tests" include("linear_solver_tests.jl")
Expand Down
3 changes: 2 additions & 1 deletion lib/OrdinaryDiffEqRosenbrock/src/OrdinaryDiffEqRosenbrock.jl
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@ import OrdinaryDiffEqCore: alg_adaptive_order, isWmethod, isfsal, _unwrap_val,
calculate_residuals, has_stiff_interpolation, ODEIntegrator,
resize_non_user_cache!, _ode_addsteps!, full_cache,
DerivativeOrderNotPossibleError, _fixup_ad,
LinearAliasSpecifier, copyat_or_push!, DifferentialVarsUndefined, resize_J_W!
LinearAliasSpecifier, copyat_or_push!, DifferentialVarsUndefined, resize_J_W!,
find_algebraic_vars_eqs
using MuladdMacro: MuladdMacro, @muladd
using FastBroadcast: FastBroadcast, @..
using RecursiveArrayTools: RecursiveArrayTools, recursivefill!
Expand Down
4 changes: 2 additions & 2 deletions lib/OrdinaryDiffEqRosenbrock/src/rosenbrock_caches.jl
Original file line number Diff line number Diff line change
Expand Up @@ -250,7 +250,7 @@ function alg_cache(
)

algebraic_vars = f.mass_matrix === I ? nothing :
[all(iszero, x) for x in eachcol(f.mass_matrix)]
find_algebraic_vars_eqs(f.mass_matrix)[1]

return Rosenbrock23Cache(
u, uprev, k₁, k₂, k₃, du1, du2, f₁,
Expand Down Expand Up @@ -305,7 +305,7 @@ function alg_cache(
)

algebraic_vars = f.mass_matrix === I ? nothing :
[all(iszero, x) for x in eachcol(f.mass_matrix)]
find_algebraic_vars_eqs(f.mass_matrix)[1]

return Rosenbrock32Cache(
u, uprev, k₁, k₂, k₃, du1, du2, f₁, fsalfirst, fsallast, dT, J, W,
Expand Down
3 changes: 2 additions & 1 deletion lib/OrdinaryDiffEqSDIRK/src/OrdinaryDiffEqSDIRK.jl
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@ using OrdinaryDiffEqCore: unwrap_alg,
trivial_limiter!,
generic_solver_docstring,
_fixup_ad, current_extrapolant!, Predictor,
isnewton, get_W, set_new_W!, COEFFICIENT_MULTISTEP
isnewton, get_W, set_new_W!, COEFFICIENT_MULTISTEP,
find_algebraic_vars_eqs
export Predictor
using TruncatedStacktraces: @truncate_stacktrace
using MuladdMacro: MuladdMacro, @muladd
Expand Down
4 changes: 3 additions & 1 deletion lib/OrdinaryDiffEqSDIRK/src/sdirk_caches.jl
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,9 @@ function alg_cache(
atmp = similar(u, uEltypeNoUnits)
recursivefill!(atmp, false)
algebraic_vars = if (alg isa ImplicitEuler) && f.mass_matrix !== I
[all(iszero, x) for x in eachcol(f.mass_matrix)]
# find_algebraic_vars_eqs is GPU-safe (broadcast-based, Diagonal-aware),
# unlike `eachcol` which triggers scalar indexing on GPU arrays.
find_algebraic_vars_eqs(f.mass_matrix)[1]
else
nothing
end
Expand Down
12 changes: 12 additions & 0 deletions test/ODEInterfaceRegression/Project.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,16 @@
ODEInterface = "54ca160b-1b9f-5127-a996-1867f4bc2a2c"
ODEInterfaceDiffEq = "09606e27-ecf5-54fc-bb29-004bd9f985bf"
OrdinaryDiffEq = "1dea7af3-3e70-54e6-95c3-0bf5283fa5ed"
OrdinaryDiffEqBDF = "6ad6398a-0878-4a85-9266-38940aa047c8"
OrdinaryDiffEqCore = "bbf590c4-e513-4bbe-9b18-05decba2e5d8"
OrdinaryDiffEqDifferentiation = "4302a76b-040a-498a-8c04-15b101fed76b"
OrdinaryDiffEqExplicitRK = "9286f039-9fbf-40e8-bf65-aa933bdc4db0"
OrdinaryDiffEqHighOrderRK = "d28bc4f8-55e1-4f49-af69-84c1a99f0f58"
OrdinaryDiffEqLowOrderRK = "1344f307-1e59-4825-a18e-ace9aa3fa4c6"
OrdinaryDiffEqNonlinearSolve = "127b3ac7-2247-4354-8eb6-78cf4e7c58e8"
OrdinaryDiffEqRosenbrock = "43230ef6-c299-4910-a778-202eb28ce4ce"
OrdinaryDiffEqRosenbrockTableaus = "b4bd8bb3-f80f-41d2-9b21-73a655b304b9"
OrdinaryDiffEqSDIRK = "2d112036-d095-4a1e-ab9a-08536f3ecdbf"
SafeTestsets = "1bc83da4-3b8d-516f-aca4-4fe02f6d838f"
SciMLTesting = "09d9d899-5365-40a9-917a-5f67fddea283"
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
Expand All @@ -23,7 +29,13 @@ SciMLTesting = "1"

[sources]
OrdinaryDiffEq = {path = "../../"}
OrdinaryDiffEqBDF = {path = "../../lib/OrdinaryDiffEqBDF"}
OrdinaryDiffEqCore = {path = "../../lib/OrdinaryDiffEqCore"}
OrdinaryDiffEqDifferentiation = {path = "../../lib/OrdinaryDiffEqDifferentiation"}
OrdinaryDiffEqExplicitRK = {path = "../../lib/OrdinaryDiffEqExplicitRK"}
OrdinaryDiffEqHighOrderRK = {path = "../../lib/OrdinaryDiffEqHighOrderRK"}
OrdinaryDiffEqLowOrderRK = {path = "../../lib/OrdinaryDiffEqLowOrderRK"}
OrdinaryDiffEqNonlinearSolve = {path = "../../lib/OrdinaryDiffEqNonlinearSolve"}
OrdinaryDiffEqRosenbrock = {path = "../../lib/OrdinaryDiffEqRosenbrock"}
OrdinaryDiffEqRosenbrockTableaus = {path = "../../lib/OrdinaryDiffEqRosenbrockTableaus"}
OrdinaryDiffEqSDIRK = {path = "../../lib/OrdinaryDiffEqSDIRK"}
44 changes: 36 additions & 8 deletions test/gpu/Project.toml
Original file line number Diff line number Diff line change
@@ -1,39 +1,67 @@
[deps]
Adapt = "79e6a3ab-5dfb-504d-930d-738a2a938a0e"
ArrayInterface = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9"
CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba"
CUDSS = "45b445bb-4962-46a0-9369-b4df9d0f772e"
ComponentArrays = "b0b7db55-cfe3-40fc-9ded-d10e2dbeff66"
DiffEqBase = "2b5f629d-d688-5b77-993f-72d75c75574e"
FastBroadcast = "7034ab61-46d4-4ed7-9d0f-46aef9175898"
FFTW = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341"
FastBroadcast = "7034ab61-46d4-4ed7-9d0f-46aef9175898"
FillArrays = "1a297f60-69ca-5386-bcde-b61e274b549b"
KrylovKit = "0b1a1467-8014-51b9-945f-bf0ae24f4b77"
LinearSolve = "7ed4a6bd-45f5-4d41-b270-4a48e9bafcae"
OrdinaryDiffEq = "1dea7af3-3e70-54e6-95c3-0bf5283fa5ed"
OrdinaryDiffEqBDF = "6ad6398a-0878-4a85-9266-38940aa047c8"
OrdinaryDiffEqCore = "bbf590c4-e513-4bbe-9b18-05decba2e5d8"
OrdinaryDiffEqDefault = "50262376-6c5a-4cf5-baba-aaf4f84d72d7"
OrdinaryDiffEqDifferentiation = "4302a76b-040a-498a-8c04-15b101fed76b"
OrdinaryDiffEqExplicitTableaus = "3278f1b1-0f5c-4cde-98e0-ba5eb00db955"
OrdinaryDiffEqFIRK = "5960d6e9-dd7a-4743-88e7-cf307b64f125"
OrdinaryDiffEqLinear = "521117fe-8c41-49f8-b3b6-30780b3f0fb5"
OrdinaryDiffEqLowOrderRK = "1344f307-1e59-4825-a18e-ace9aa3fa4c6"
OrdinaryDiffEqLowStorageRK = "b0944070-b475-4768-8dec-fb6eb410534d"
OrdinaryDiffEqNonlinearSolve = "127b3ac7-2247-4354-8eb6-78cf4e7c58e8"
OrdinaryDiffEqRKIP = "a4daff8c-1d43-4ff3-8eff-f78720aeecdc"
OrdinaryDiffEqRosenbrock = "43230ef6-c299-4910-a778-202eb28ce4ce"
OrdinaryDiffEqRosenbrockTableaus = "b4bd8bb3-f80f-41d2-9b21-73a655b304b9"
OrdinaryDiffEqSDIRK = "2d112036-d095-4a1e-ab9a-08536f3ecdbf"
OrdinaryDiffEqStabilizedRK = "358294b1-0aab-51c3-aafe-ad5ab194a2ad"
OrdinaryDiffEqTsit5 = "b1df2697-797e-41e3-8120-5422d3b24e4a"
OrdinaryDiffEqVerner = "79d7bb75-1356-48c1-b8c0-6832512096c2"
Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7"
RecursiveArrayTools = "731186ca-8d62-57ce-b412-fbd966d074cd"
SciMLBase = "0bca4576-84f4-4d90-8ffe-ffa030f20462"
SciMLOperators = "c0aeaf25-5076-4817-a8d5-81caf7dfa961"

[sources]
DiffEqBase = {path = "../../lib/DiffEqBase"}
OrdinaryDiffEq = {path = "../.."}
OrdinaryDiffEqBDF = {path = "../../lib/OrdinaryDiffEqBDF"}
OrdinaryDiffEqCore = {path = "../../lib/OrdinaryDiffEqCore"}
OrdinaryDiffEqDefault = {path = "../../lib/OrdinaryDiffEqDefault"}
OrdinaryDiffEqDifferentiation = {path = "../../lib/OrdinaryDiffEqDifferentiation"}
OrdinaryDiffEqExplicitTableaus = {path = "../../lib/OrdinaryDiffEqExplicitTableaus"}
OrdinaryDiffEqFIRK = {path = "../../lib/OrdinaryDiffEqFIRK"}
OrdinaryDiffEqLinear = {path = "../../lib/OrdinaryDiffEqLinear"}
OrdinaryDiffEqLowOrderRK = {path = "../../lib/OrdinaryDiffEqLowOrderRK"}
OrdinaryDiffEqLowStorageRK = {path = "../../lib/OrdinaryDiffEqLowStorageRK"}
OrdinaryDiffEqNonlinearSolve = {path = "../../lib/OrdinaryDiffEqNonlinearSolve"}
OrdinaryDiffEqRKIP = {path = "../../lib/OrdinaryDiffEqRKIP"}
OrdinaryDiffEqRosenbrock = {path = "../../lib/OrdinaryDiffEqRosenbrock"}
OrdinaryDiffEqRosenbrockTableaus = {path = "../../lib/OrdinaryDiffEqRosenbrockTableaus"}
OrdinaryDiffEqSDIRK = {path = "../../lib/OrdinaryDiffEqSDIRK"}
OrdinaryDiffEqStabilizedRK = {path = "../../lib/OrdinaryDiffEqStabilizedRK"}
OrdinaryDiffEqTsit5 = {path = "../../lib/OrdinaryDiffEqTsit5"}
OrdinaryDiffEqVerner = {path = "../../lib/OrdinaryDiffEqVerner"}

[compat]
Adapt = "4"
CUDA = "6"
CUDSS = "0.7, 0.8"
ComponentArrays = "0.15"
DiffEqBase = "7"
FastBroadcast = "1.3"
FFTW = "1.8"
FastBroadcast = "1.3"
FillArrays = "1"
OrdinaryDiffEq = "7"
OrdinaryDiffEqBDF = "2"
OrdinaryDiffEqNonlinearSolve = "2"
OrdinaryDiffEqRKIP = "2"
OrdinaryDiffEqRosenbrock = "2"
RecursiveArrayTools = "4"
SciMLBase = "3"
SciMLOperators = "1.3"
1 change: 1 addition & 0 deletions test/gpu/autoswitch.jl
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using OrdinaryDiffEq, CUDA, Test
using OrdinaryDiffEqLowOrderRK: AutoDP5
CUDA.allowscalar(false)

# https://github.com/SciML/OrdinaryDiffEq.jl/issues/1614
Expand Down
Loading
Loading