From 61e66fe83439ec878e4cff8aef9bcb0ea31f12cf Mon Sep 17 00:00:00 2001 From: termi-official Date: Mon, 2 Feb 2026 17:44:25 +0100 Subject: [PATCH 1/9] Upgrade Restart API to OrdinaryDiffEqCore 3.4 --- src/callbacks_step/save_restart.jl | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/callbacks_step/save_restart.jl b/src/callbacks_step/save_restart.jl index 0d6a355dbfe..6cf85afb9b0 100644 --- a/src/callbacks_step/save_restart.jl +++ b/src/callbacks_step/save_restart.jl @@ -182,6 +182,15 @@ function load_adaptive_time_integrator!(integrator, restart_file::AbstractString end # Load data that is required both for PIController and PIDController integrator.qold = read(attributes(file)["time_integrator_qold"]) + if hasproperty(controller, :qold) + controller.qold = read(attributes(file)["time_integrator_qold"]) + end + if hasproperty(controller, :errold) + controller.errold = read(attributes(file)["time_integrator_qold"]) + end + if hasproperty(controller, :dt_factor) # PID controller cache + controller.dt_factor = read(attributes(file)["time_integrator_qold"]) + end integrator.dtpropose = read(attributes(file)["time_integrator_dtpropose"]) # Accept step to use dtpropose already in the first step integrator.accept_step = true From e1eeb89fd6df763c25229c5a864584e5cbf74c94 Mon Sep 17 00:00:00 2001 From: termi-official Date: Mon, 2 Feb 2026 19:40:24 +0100 Subject: [PATCH 2/9] Move to a dispatch based loader for the controller to keep it extendable. --- Project.toml | 3 ++ ext/TrixiOrdinaryDiffEqCore.jl | 47 ++++++++++++++++++++++++++++++ src/callbacks_step/save_restart.jl | 24 ++++----------- 3 files changed, 55 insertions(+), 19 deletions(-) create mode 100644 ext/TrixiOrdinaryDiffEqCore.jl diff --git a/Project.toml b/Project.toml index d54ba35e9e1..23c6acfcb6b 100644 --- a/Project.toml +++ b/Project.toml @@ -59,6 +59,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] @@ -66,6 +67,7 @@ TrixiCUDAExt = "CUDA" TrixiConvexECOSExt = ["Convex", "ECOS"] TrixiMakieExt = "Makie" TrixiNLsolveExt = "NLsolve" +TrixiOrdinaryDiffEqCore = "OrdinaryDiffEqCore" TrixiSparseConnectivityTracerExt = "SparseConnectivityTracer" [compat] @@ -95,6 +97,7 @@ MuladdMacro = "0.2.4" NLsolve = "4.5.1" Octavian = "0.3.28" OffsetArrays = "1.13" +OrdinaryDiffEqCore = "1,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..ce2503b68a3 --- /dev/null +++ b/ext/TrixiOrdinaryDiffEqCore.jl @@ -0,0 +1,47 @@ +module TrixiOrdinaryDiffEqCore + +import Trixi: load_controller! +import OrdinaryDiffEqCore: PIController, PIDController + +@static if Base.pkgversion(OrdinaryDiffEqCore) >= v"3.3" + + 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.3" + +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 + 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 6cf85afb9b0..2c268b843a0 100644 --- a/src/callbacks_step/save_restart.jl +++ b/src/callbacks_step/save_restart.jl @@ -174,34 +174,20 @@ 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"]) - if hasproperty(controller, :qold) - controller.qold = read(attributes(file)["time_integrator_qold"]) - end - if hasproperty(controller, :errold) - controller.errold = read(attributes(file)["time_integrator_qold"]) - end - if hasproperty(controller, :dt_factor) # PID controller cache - controller.dt_factor = read(attributes(file)["time_integrator_qold"]) - end 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 +load_controller!(integrator, controller, file) = error("Loading of controller $(typeof(controller)) not implemented.") + include("save_restart_dg.jl") end # @muladd From 78b590373d7759d093c48ddbcbd80aea8b5adc63 Mon Sep 17 00:00:00 2001 From: termi-official Date: Mon, 2 Feb 2026 19:52:52 +0100 Subject: [PATCH 3/9] Use correct version in Ext --- ext/TrixiOrdinaryDiffEqCore.jl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ext/TrixiOrdinaryDiffEqCore.jl b/ext/TrixiOrdinaryDiffEqCore.jl index ce2503b68a3..c93c5eb30f0 100644 --- a/ext/TrixiOrdinaryDiffEqCore.jl +++ b/ext/TrixiOrdinaryDiffEqCore.jl @@ -1,9 +1,9 @@ module TrixiOrdinaryDiffEqCore import Trixi: load_controller! -import OrdinaryDiffEqCore: PIController, PIDController +import OrdinaryDiffEqCore: OrdinaryDiffEqCore, PIController, PIDController -@static if Base.pkgversion(OrdinaryDiffEqCore) >= v"3.3" +@static if Base.pkgversion(OrdinaryDiffEqCore) >= v"3.4" import OrdinaryDiffEqCore: PIControllerCache, PIDControllerCache @@ -25,7 +25,7 @@ function load_controller!(integrator, controller::PIDController, file) controller.err[:] = read(attributes(file)["time_integrator_controller_err"]) end -@static if Base.pkgversion(OrdinaryDiffEqCore) >= v"3.3" +@static if Base.pkgversion(OrdinaryDiffEqCore) >= v"3.4" function load_controller!(integrator, controller::PIControllerCache, file) if !("time_integrator_qold" in keys(attributes(file))) From 5a8541137d528b7007c5ad587161f7e13b318f60 Mon Sep 17 00:00:00 2001 From: termi-official Date: Mon, 2 Feb 2026 19:53:28 +0100 Subject: [PATCH 4/9] Use correct lower bound for Core as suggested by Joshua --- test/Project.toml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/test/Project.toml b/test/Project.toml index ad8aaffce0f..fed6e9b19f4 100644 --- a/test/Project.toml +++ b/test/Project.toml @@ -1,6 +1,6 @@ [deps] -Accessors = "7d9f7c33-5ae7-4f3b-8dc6-eff91059b697" ADTypes = "47edcb42-4c32-4615-8424-f2b9edc5f35b" +Accessors = "7d9f7c33-5ae7-4f3b-8dc6-eff91059b697" Adapt = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" Aqua = "4c88cf16-eb10-579e-8560-4a9242c79595" CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" @@ -39,11 +39,12 @@ SparseConnectivityTracer = "9f842d2f-2579-4b1d-911e-f412cf18a3f5" SparseMatrixColorings = "0a514795-09f3-496d-8182-132a7b665d35" StableRNGs = "860ef19b-820b-49d6-a774-d7a799459cd3" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" +Trixi = "a7f1ee26-1774-49b1-8366-f1abc58fbfcb" TrixiTest = "0a316866-cbd0-4425-8bcb-08103b2c1f26" [compat] -Accessors = "0.1.36" ADTypes = "1.14" +Accessors = "0.1.36" Adapt = "4.1" Aqua = "0.8" CUDA = "5.8.2" From 765918819fb9d6fbe89069441b7eb238b22b19cd Mon Sep 17 00:00:00 2001 From: termi-official Date: Mon, 2 Feb 2026 19:58:48 +0100 Subject: [PATCH 5/9] Apply formatter --- ext/TrixiOrdinaryDiffEqCore.jl | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/ext/TrixiOrdinaryDiffEqCore.jl b/ext/TrixiOrdinaryDiffEqCore.jl index c93c5eb30f0..b543caf3003 100644 --- a/ext/TrixiOrdinaryDiffEqCore.jl +++ b/ext/TrixiOrdinaryDiffEqCore.jl @@ -4,9 +4,7 @@ import Trixi: load_controller! import OrdinaryDiffEqCore: OrdinaryDiffEqCore, PIController, PIDController @static if Base.pkgversion(OrdinaryDiffEqCore) >= v"3.4" - import OrdinaryDiffEqCore: PIControllerCache, PIDControllerCache - end # Support to load controller @@ -18,7 +16,8 @@ function load_controller!(integrator, controller::PIController, file) end function load_controller!(integrator, controller::PIDController, file) - if !("time_integrator_qold" in keys(attributes(file)) || !("time_integrator_controller_err" in keys(attributes(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"]) @@ -26,22 +25,21 @@ function load_controller!(integrator, controller::PIDController, file) 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!") + 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 - 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!") + 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 + integrator.qold = read(attributes(file)["time_integrator_qold"]) + controller.err[:] = read(attributes(file)["time_integrator_controller_err"]) end - integrator.qold = read(attributes(file)["time_integrator_qold"]) - controller.err[:] = read(attributes(file)["time_integrator_controller_err"]) -end - end end From c52f6b65a9d8a11af93f847c0b83740b250d7818 Mon Sep 17 00:00:00 2001 From: termi-official Date: Mon, 2 Feb 2026 21:06:57 +0100 Subject: [PATCH 6/9] Load correct errold. --- ext/TrixiOrdinaryDiffEqCore.jl | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ext/TrixiOrdinaryDiffEqCore.jl b/ext/TrixiOrdinaryDiffEqCore.jl index b543caf3003..d3b5a29c86b 100644 --- a/ext/TrixiOrdinaryDiffEqCore.jl +++ b/ext/TrixiOrdinaryDiffEqCore.jl @@ -29,7 +29,8 @@ end 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"]) + controller.errold = read(attributes(file)["time_integrator_controller_err"]) + integrator.qold = read(attributes(file)["time_integrator_qold"]) end function load_controller!(integrator, controller::PIDControllerCache, file) @@ -37,7 +38,7 @@ end !("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.dt_factor = integrator.qold = read(attributes(file)["time_integrator_qold"]) controller.err[:] = read(attributes(file)["time_integrator_controller_err"]) end end From 511122e719609bb816e02380ff9a8d2b213aae78 Mon Sep 17 00:00:00 2001 From: termi-official Date: Wed, 4 Feb 2026 13:05:31 +0100 Subject: [PATCH 7/9] Add correct HDF5 import to ext --- ext/TrixiOrdinaryDiffEqCore.jl | 1 + 1 file changed, 1 insertion(+) diff --git a/ext/TrixiOrdinaryDiffEqCore.jl b/ext/TrixiOrdinaryDiffEqCore.jl index d3b5a29c86b..345644fb612 100644 --- a/ext/TrixiOrdinaryDiffEqCore.jl +++ b/ext/TrixiOrdinaryDiffEqCore.jl @@ -2,6 +2,7 @@ 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 From 3c4662eeb2648ececdba97a6d42aac1bb2574402 Mon Sep 17 00:00:00 2001 From: termi-official Date: Wed, 4 Feb 2026 13:49:28 +0100 Subject: [PATCH 8/9] Allow the new OrdinaryDiffEqCore version again and format. --- Project.toml | 2 +- ext/TrixiOrdinaryDiffEqCore.jl | 3 +-- src/callbacks_step/save_restart.jl | 6 ++++-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/Project.toml b/Project.toml index 1194e98354b..2e1c39a5fcb 100644 --- a/Project.toml +++ b/Project.toml @@ -98,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 index 345644fb612..1984f8720c8 100644 --- a/ext/TrixiOrdinaryDiffEqCore.jl +++ b/ext/TrixiOrdinaryDiffEqCore.jl @@ -30,8 +30,7 @@ end 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 = read(attributes(file)["time_integrator_controller_err"]) - integrator.qold = read(attributes(file)["time_integrator_qold"]) + controller.errold = integrator.qold = read(attributes(file)["time_integrator_qold"]) end function load_controller!(integrator, controller::PIDControllerCache, file) diff --git a/src/callbacks_step/save_restart.jl b/src/callbacks_step/save_restart.jl index 2c268b843a0..95b8a3a51de 100644 --- a/src/callbacks_step/save_restart.jl +++ b/src/callbacks_step/save_restart.jl @@ -182,12 +182,14 @@ function load_adaptive_time_integrator!(integrator, restart_file::AbstractString integrator.accept_step = true # Reevaluate integrator.fsal_first on the first step integrator.reeval_fsal = true - + load_controller!(integrator, controller, file) end end -load_controller!(integrator, controller, file) = error("Loading of controller $(typeof(controller)) not implemented.") +function load_controller!(integrator, controller, file) + return error("Loading of controller $(typeof(controller)) not implemented.") +end include("save_restart_dg.jl") end # @muladd From db12ed589b2c58463539b6f8e4740065d6fce150 Mon Sep 17 00:00:00 2001 From: Joshua Lampert Date: Wed, 4 Feb 2026 20:43:39 +0100 Subject: [PATCH 9/9] cleanup --- test/Project.toml | 5 ++--- test/test_aqua.jl | 3 +-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/test/Project.toml b/test/Project.toml index fed6e9b19f4..ad8aaffce0f 100644 --- a/test/Project.toml +++ b/test/Project.toml @@ -1,6 +1,6 @@ [deps] -ADTypes = "47edcb42-4c32-4615-8424-f2b9edc5f35b" Accessors = "7d9f7c33-5ae7-4f3b-8dc6-eff91059b697" +ADTypes = "47edcb42-4c32-4615-8424-f2b9edc5f35b" Adapt = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" Aqua = "4c88cf16-eb10-579e-8560-4a9242c79595" CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" @@ -39,12 +39,11 @@ SparseConnectivityTracer = "9f842d2f-2579-4b1d-911e-f412cf18a3f5" SparseMatrixColorings = "0a514795-09f3-496d-8182-132a7b665d35" StableRNGs = "860ef19b-820b-49d6-a774-d7a799459cd3" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" -Trixi = "a7f1ee26-1774-49b1-8366-f1abc58fbfcb" TrixiTest = "0a316866-cbd0-4425-8bcb-08103b2c1f26" [compat] -ADTypes = "1.14" Accessors = "0.1.36" +ADTypes = "1.14" Adapt = "4.1" Aqua = "0.8" CUDA = "5.8.2" 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)))