1+ using ModelingToolkit: operation
12# Method of lines discretization scheme
23struct MOLFiniteDifference{T} <: DiffEqBase.AbstractDiscretization
34 dxs:: T
@@ -10,7 +11,7 @@ function get_bcs(bcs,tdomain,domain)
1011 lhs_deriv_depvars_bcs = Dict ()
1112 no_bcs = size (bcs,1 )
1213 for i = 1 : no_bcs
13- var = ModelingToolkit . operation (bcs[i]. lhs)
14+ var = operation (bcs[i]. lhs)
1415 if var isa Sym
1516 var = var. name
1617 if ! haskey (lhs_deriv_depvars_bcs,var)
4546function discretize_2 (input,deriv_order,approx_order,dx,X,len,
4647 deriv_var,dep_var_idx,indep_var_idx)
4748 if ! (input isa ModelingToolkit. Symbolic)
48- return :($ (input. value ))
49+ return :($ (input))
4950 else
50- if input isa Sym
51+ if input isa Sym || (input isa Term && operation (input) isa Sym)
5152 expr = :(0.0 )
52- var = nameof (input)
53+ var = nameof (input isa Sym ? input : operation (input) )
5354 if haskey (indep_var_idx,var) # ind. var.
5455 if var != :(t)
5556 i = indep_var_idx[var]
@@ -75,18 +76,17 @@ function discretize_2(input,deriv_order,approx_order,dx,X,len,
7576 end
7677 end
7778 return expr
78- elseif input. op isa Differential
79+ elseif input isa Term && operation (input) isa Differential
7980 var = nameof (input. op. x)
8081 push! (deriv_var,var)
8182 return discretize_2 (input. args[1 ],deriv_order+ 1 ,approx_order,dx,X,
8283 len,deriv_var,dep_var_idx,indep_var_idx)
8384 pop! (deriv_var,var)
8485 else
85- name = ModelingToolkit . operation (input). name
86+ name = nameof ( operation (input))
8687 if size (input. args,1 ) == 1
8788 aux = discretize_2 (input. args[1 ],deriv_order,approx_order,dx,X,
8889 len,deriv_var,dep_var_idx,indep_var_idx)
89- @show input. op
9090 return :(broadcast ($ name, $ aux))
9191 else
9292 aux_1 = discretize_2 (input. args[1 ],deriv_order,approx_order,dx,X,
@@ -169,10 +169,11 @@ function DiffEqBase.discretize(pdesys::PDESystem,discretization::MOLFiniteDiffer
169169 no_dep_vars = size (eqs,1 )
170170 for j = 1 : no_dep_vars
171171 input = eqs[j]. lhs
172- if input. op isa Sym
173- var = nameof (input)
172+ op = operation (input)
173+ if op isa Sym
174+ var = nameof (op)
174175 else # var isa Differential
175- var = nameof (ModelingToolkit . operation (input. args[1 ]))
176+ var = nameof (operation (input. args[1 ]))
176177 lhs_deriv_depvars[var] = j
177178 end
178179 dep_var_idx[var] = j
@@ -181,7 +182,6 @@ function DiffEqBase.discretize(pdesys::PDESystem,discretization::MOLFiniteDiffer
181182 aux = discretize_2 ( eqs[j]. rhs,0 ,approx_order,dx,X,len,
182183 [],dep_var_idx,indep_var_idx)
183184 # TODO : is there a better way to convert an Expr into a Function?
184- @show aux
185185 dep_var_disc[var] = @eval (Q,u,t) -> $ aux
186186 end
187187
0 commit comments