diff --git a/Project.toml b/Project.toml index ec4edd4d4a6..d13c45b7ec1 100644 --- a/Project.toml +++ b/Project.toml @@ -60,6 +60,7 @@ Convex = "f65535da-76fb-5f13-bab9-19810c17039a" ECOS = "e2685f51-7e38-5353-a97d-a921fd2c8199" Makie = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" NLsolve = "2774e3e8-f4cf-5e23-947b-6d7e65073b56" +OrdinaryDiffEqCore = "bbf590c4-e513-4bbe-9b18-05decba2e5d8" SparseConnectivityTracer = "9f842d2f-2579-4b1d-911e-f412cf18a3f5" [extensions] @@ -67,6 +68,7 @@ TrixiCUDAExt = "CUDA" TrixiConvexECOSExt = ["Convex", "ECOS"] TrixiMakieExt = "Makie" TrixiNLsolveExt = "NLsolve" +TrixiOrdinaryDiffEqCore = "OrdinaryDiffEqCore" TrixiSparseConnectivityTracerExt = "SparseConnectivityTracer" [compat] @@ -96,7 +98,7 @@ MuladdMacro = "0.2.4" NLsolve = "4.5.1" Octavian = "0.3.28" OffsetArrays = "1.13" -OrdinaryDiffEqCore = "1.26, 2, 3.0.0 - 3.2.0" +OrdinaryDiffEqCore = "1.26, 2, 3" P4est = "0.4.12" Polyester = "=0.7.16, 0.7.18" PrecompileTools = "1.2" diff --git a/ext/TrixiOrdinaryDiffEqCore.jl b/ext/TrixiOrdinaryDiffEqCore.jl new file mode 100644 index 00000000000..1984f8720c8 --- /dev/null +++ b/ext/TrixiOrdinaryDiffEqCore.jl @@ -0,0 +1,46 @@ +module TrixiOrdinaryDiffEqCore + +import Trixi: load_controller! +import OrdinaryDiffEqCore: OrdinaryDiffEqCore, PIController, PIDController +import HDF5: attributes + +@static if Base.pkgversion(OrdinaryDiffEqCore) >= v"3.4" + import OrdinaryDiffEqCore: PIControllerCache, PIDControllerCache +end + +# Support to load controller +function load_controller!(integrator, controller::PIController, file) + if !("time_integrator_qold" in keys(attributes(file))) + error("Missing data in restart file: check the consistency of adaptive time controller with initial setup!") + end + integrator.qold = read(attributes(file)["time_integrator_qold"]) +end + +function load_controller!(integrator, controller::PIDController, file) + if !("time_integrator_qold" in keys(attributes(file)) || + !("time_integrator_controller_err" in keys(attributes(file)))) + error("Missing data in restart file: check the consistency of adaptive time controller with initial setup!") + end + integrator.qold = read(attributes(file)["time_integrator_qold"]) + controller.err[:] = read(attributes(file)["time_integrator_controller_err"]) +end + +@static if Base.pkgversion(OrdinaryDiffEqCore) >= v"3.4" + function load_controller!(integrator, controller::PIControllerCache, file) + if !("time_integrator_qold" in keys(attributes(file))) + error("Missing data in restart file: check the consistency of adaptive time controller with initial setup!") + end + controller.errold = integrator.qold = read(attributes(file)["time_integrator_qold"]) + end + + function load_controller!(integrator, controller::PIDControllerCache, file) + if !("time_integrator_qold" in keys(attributes(file)) || + !("time_integrator_controller_err" in keys(attributes(file)))) + error("Missing data in restart file: check the consistency of adaptive time controller with initial setup!") + end + controller.dt_factor = integrator.qold = read(attributes(file)["time_integrator_qold"]) + controller.err[:] = read(attributes(file)["time_integrator_controller_err"]) + end +end + +end diff --git a/src/callbacks_step/save_restart.jl b/src/callbacks_step/save_restart.jl index 0d6a355dbfe..95b8a3a51de 100644 --- a/src/callbacks_step/save_restart.jl +++ b/src/callbacks_step/save_restart.jl @@ -174,25 +174,22 @@ function load_adaptive_time_integrator!(integrator, restart_file::AbstractString # Read context information for controller h5open(restart_file, "r") do file # Ensure that the necessary information was saved - if !("time_integrator_qold" in keys(attributes(file))) || - !("time_integrator_dtpropose" in keys(attributes(file))) || - (hasproperty(controller, :err) && - !("time_integrator_controller_err" in keys(attributes(file)))) + if !("time_integrator_dtpropose" in keys(attributes(file))) error("Missing data in restart file: check the consistency of adaptive time controller with initial setup!") end - # Load data that is required both for PIController and PIDController - integrator.qold = read(attributes(file)["time_integrator_qold"]) integrator.dtpropose = read(attributes(file)["time_integrator_dtpropose"]) # Accept step to use dtpropose already in the first step integrator.accept_step = true # Reevaluate integrator.fsal_first on the first step integrator.reeval_fsal = true - # Load additional parameters for PIDController - if hasproperty(controller, :err) # Distinguish PIDController from PIController - controller.err[:] = read(attributes(file)["time_integrator_controller_err"]) - end + + load_controller!(integrator, controller, file) end end +function load_controller!(integrator, controller, file) + return error("Loading of controller $(typeof(controller)) not implemented.") +end + include("save_restart_dg.jl") end # @muladd diff --git a/test/test_aqua.jl b/test/test_aqua.jl index 2d8c1a77230..154088995ca 100644 --- a/test/test_aqua.jl +++ b/test/test_aqua.jl @@ -16,8 +16,7 @@ include("test_trixi.jl") piracies = (treat_as_own = [Trixi.StartUpDG.RefElemData, Trixi.StartUpDG.MeshData],), # exception necessary because StableRNGs.jl is only used in an extension - # OrdinaryDiffEqCore.jl is a hotfix introduced in https://github.dev/trixi-framework/Trixi.jl/pull/2775 - stale_deps = (ignore = [:StableRNGs, :OrdinaryDiffEqCore],)) + stale_deps = (ignore = [:StableRNGs],)) @test isnothing(check_no_implicit_imports(Trixi, skip = (Core, Base, Trixi.P4est, Trixi.T8code, Trixi.EllipsisNotation)))