From bc8cec852febcbb44bee322715b119dc0cc41c81 Mon Sep 17 00:00:00 2001 From: utkuyilmaz1903 Date: Tue, 7 Jul 2026 13:49:48 +0300 Subject: [PATCH 1/2] fix(discretization): fold symbolic initial conditions to satisfy strict MTK v1.45 API --- src/MethodOfLines.jl | 3 ++- src/discretization/generate_ic_defaults.jl | 15 +++++++++------ test/qa/qa.jl | 2 +- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/MethodOfLines.jl b/src/MethodOfLines.jl index db3b30695..3feb8c796 100644 --- a/src/MethodOfLines.jl +++ b/src/MethodOfLines.jl @@ -8,7 +8,8 @@ using ModelingToolkit: get_unknowns, get_ivs using SymbolicIndexingInterface using SymbolicUtils, Symbolics -using Symbolics: unwrap, symbolic_linear_solve, expand_derivatives, diff2term +using Symbolics: unwrap, symbolic_linear_solve, expand_derivatives, diff2term, + symbolic_to_float using SymbolicUtils: operation, arguments, iscall, getmetadata, unwrap_const using IfElse using StaticArrays diff --git a/src/discretization/generate_ic_defaults.jl b/src/discretization/generate_ic_defaults.jl index f261cda5d..933c85979 100644 --- a/src/discretization/generate_ic_defaults.jl +++ b/src/discretization/generate_ic_defaults.jl @@ -14,14 +14,17 @@ function PDEBase.generate_ic_defaults( D = ic.order == 0 ? identity : (Differential(t)^ic.order) defaultvars = D.(s.discvars[depvar(ic.u, s)]) broadcastable_rhs = [symbolic_linear_solve(ic.eq, D(ic.u))] - out = pde_substitute.( + rhs_vals = pde_substitute.( broadcastable_rhs, Dict.(valmaps(s, depvar(ic.u, s), ic.depvars, indexmap)) ) - vec( - defaultvars .=> pde_substitute.( - broadcastable_rhs, Dict.(valmaps(s, depvar(ic.u, s), ic.depvars, indexmap)) - ) - ) + # Substitution in SymbolicUtils v4 no longer constant-folds function calls, so an + # IC like `u(0, x) ~ cos(x)` produces stuck terms like `cos(0.108...)`. MTK v11's + # `varmap_to_vars` requires literal constants in the u0 map and reports any + # unfolded value as "Initial condition underdefined". `symbolic_to_float` folds + # fully-constant expressions to numbers and leaves genuinely symbolic values + # (e.g. parameter-dependent ICs) untouched for MTK to resolve downstream. + fold(v) = v isa Number ? v : symbolic_to_float(v) + vec(defaultvars .=> fold.(rhs_vals)) end else u0 = [] diff --git a/test/qa/qa.jl b/test/qa/qa.jl index 58a93c2aa..6a1450820 100644 --- a/test/qa/qa.jl +++ b/test/qa/qa.jl @@ -44,7 +44,7 @@ run_qa( :Interval, :add_metadata!, :error_analysis, :get_ops, :insert, :remove, :sym_dot, :unitindex, :unitindices, :update_varmap!, :vcat!, # non-public in Symbolics: - :diff2term, + :diff2term, :symbolic_to_float, ), ), all_qualified_accesses_are_public = (; From 9c3713ed07c49380ac0beaf0dcd194213831b43e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Utku=20Y=C4=B1lmaz?= Date: Tue, 7 Jul 2026 15:27:53 +0300 Subject: [PATCH 2/2] Refactor initial condition handling in generate_ic_defaults Refactor the handling of initial conditions to ensure proper folding of symbolic expressions. --- src/discretization/generate_ic_defaults.jl | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/discretization/generate_ic_defaults.jl b/src/discretization/generate_ic_defaults.jl index 933c85979..7e81286f7 100644 --- a/src/discretization/generate_ic_defaults.jl +++ b/src/discretization/generate_ic_defaults.jl @@ -17,12 +17,7 @@ function PDEBase.generate_ic_defaults( rhs_vals = pde_substitute.( broadcastable_rhs, Dict.(valmaps(s, depvar(ic.u, s), ic.depvars, indexmap)) ) - # Substitution in SymbolicUtils v4 no longer constant-folds function calls, so an - # IC like `u(0, x) ~ cos(x)` produces stuck terms like `cos(0.108...)`. MTK v11's - # `varmap_to_vars` requires literal constants in the u0 map and reports any - # unfolded value as "Initial condition underdefined". `symbolic_to_float` folds - # fully-constant expressions to numbers and leaves genuinely symbolic values - # (e.g. parameter-dependent ICs) untouched for MTK to resolve downstream. + fold(v) = v isa Number ? v : symbolic_to_float(v) vec(defaultvars .=> fold.(rhs_vals)) end