1+ using ModelingToolkit: operation
12# Method of lines discretization scheme
23struct MOLFiniteDifference{T} <: DiffEqBase.AbstractDiscretization
34 dxs:: T
@@ -10,8 +11,8 @@ 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 = bcs[i]. lhs. op
14- if var isa Variable
14+ var = operation ( bcs[i]. lhs)
15+ if var isa Sym
1516 var = var. name
1617 if ! haskey (lhs_deriv_depvars_bcs,var)
1718 lhs_deriv_depvars_bcs[var] = Array {Expr} (undef,3 )
@@ -24,10 +25,10 @@ function get_bcs(bcs,tdomain,domain)
2425 elseif isequal (bcs[i]. lhs. args[2 ],domain. upper) # u(t,x=x_final)
2526 j = 3
2627 end
27- if bcs[i]. rhs isa ModelingToolkit. Constant
28- lhs_deriv_depvars_bcs[var][j] = :(var= $ (bcs[i]. rhs. value ))
28+ if ! ( bcs[i]. rhs isa ModelingToolkit. Symbolic)
29+ lhs_deriv_depvars_bcs[var][j] = :(var= $ (bcs[i]. rhs))
2930 else
30- lhs_deriv_depvars_bcs[var][j] = Expr (bcs[i]. rhs)
31+ lhs_deriv_depvars_bcs[var][j] = toexpr (bcs[i]. rhs)
3132 end
3233 end
3334 end
4445
4546function discretize_2 (input,deriv_order,approx_order,dx,X,len,
4647 deriv_var,dep_var_idx,indep_var_idx)
47- if input isa ModelingToolkit. Constant
48- return :($ (input. value ))
49- elseif input isa Operation
50- if input. op isa Variable
48+ if ! ( input isa ModelingToolkit. Symbolic)
49+ return :($ (input))
50+ else
51+ if input isa Sym || (input isa Term && operation (input) isa Sym)
5152 expr = :(0.0 )
52- var = input. op . name
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,23 +76,24 @@ 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- var = input. op. x. op . name
79+ elseif input isa Term && operation (input) isa Differential
80+ 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
86+ name = nameof (operation (input))
8587 if size (input. args,1 ) == 1
8688 aux = discretize_2 (input. args[1 ],deriv_order,approx_order,dx,X,
8789 len,deriv_var,dep_var_idx,indep_var_idx)
88- return :(broadcast ($ (input . op) , $ aux))
90+ return :(broadcast ($ name , $ aux))
8991 else
9092 aux_1 = discretize_2 (input. args[1 ],deriv_order,approx_order,dx,X,
9193 len,deriv_var,dep_var_idx,indep_var_idx)
9294 aux_2 = discretize_2 (input. args[2 ],deriv_order,approx_order,dx,X,
9395 len,deriv_var,dep_var_idx,indep_var_idx)
94- return :(broadcast ($ (input . op) , $ aux_1, $ aux_2))
96+ return :(broadcast ($ name , $ aux_1, $ aux_2))
9597 end
9698 end
9799 end
@@ -132,7 +134,7 @@ function DiffEqBase.discretize(pdesys::PDESystem,discretization::MOLFiniteDiffer
132134 len = Array {Any} (undef,no_indep_vars)
133135 k = 0
134136 for i = 1 : no_indep_vars
135- var = pdesys. domain[i]. variables. op . name
137+ var = nameof ( pdesys. domain[i]. variables)
136138 indep_var_idx[var] = i
137139 domain[i] = pdesys. domain[i]. domain
138140 if var != :(t)
@@ -167,10 +169,11 @@ function DiffEqBase.discretize(pdesys::PDESystem,discretization::MOLFiniteDiffer
167169 no_dep_vars = size (eqs,1 )
168170 for j = 1 : no_dep_vars
169171 input = eqs[j]. lhs
170- if input. op isa Variable
171- var = input. op. name
172+ op = operation (input)
173+ if op isa Sym
174+ var = nameof (op)
172175 else # var isa Differential
173- var = input. args[1 ]. op . name
176+ var = nameof ( operation ( input. args[1 ]))
174177 lhs_deriv_depvars[var] = j
175178 end
176179 dep_var_idx[var] = j
0 commit comments