@@ -2,8 +2,21 @@ using ModelingToolkit: operation, istree, arguments
22# Method of lines discretization scheme
33struct MOLFiniteDifference{T} <: DiffEqBase.AbstractDiscretization
44 dxs:: T
5- order:: Int
6- MOLFiniteDifference (args... ;order= 2 ) = new {typeof(args[1])} (args[1 ],order)
5+ upwind_order:: Int
6+ centered_order:: Int
7+ end
8+
9+ # Constructors. If no order is specified, both upwind and centered differences will be 2nd order
10+ MOLFiniteDifference (dxs:: T , order) where T =
11+ MOLFiniteDifference {T} (dxs, order, order)
12+
13+ function MOLFiniteDifference (dxs:: T ; order = nothing , upwind_order = 1 ,
14+ centered_order = 2 ) where T
15+ MOLFiniteDifference (
16+ dxs,
17+ order === nothing ? upwind_order : order,
18+ order === nothing ? centered_order : order
19+ )
720end
821
922function throw_bc_err (bc)
147160# E.g., Dx(u(t,x))=v(t,x)*Dx(u(t,x)), v(t,x)=t*x
148161# => Dx(u(t,x))=t*x*Dx(u(t,x))
149162
150- function discretize_2 (input,deriv_order,approx_order ,dx,X,len_of_indep_vars,
163+ function discretize_2 (input,deriv_order,upwind_order,centered_order ,dx,X,len_of_indep_vars,
151164 deriv_var,dep_var_idx,indep_var_idx)
152165 if ! (input isa ModelingToolkit. Symbolic)
153166 return :($ (input))
@@ -171,30 +184,29 @@ function discretize_2(input,deriv_order,approx_order,dx,X,len_of_indep_vars,
171184 elseif deriv_order == 1
172185 # TODO : approx_order and forward/backward should be
173186 # input parameters of each derivative
174- approx_order = 1
175- L = UpwindDifference (deriv_order,approx_order,dx[i],len_of_indep_vars[i]- 2 ,- 1 )
187+ L = UpwindDifference (deriv_order,upwind_order,dx[i],len_of_indep_vars[i]- 2 ,- 1 )
176188 expr = :(- 1 * ($ L* Q[$ j]* u[:,$ j]))
177189 elseif deriv_order == 2
178- L = CenteredDifference (deriv_order,approx_order ,dx[i],len_of_indep_vars[i]- 2 )
190+ L = CenteredDifference (deriv_order,centered_order ,dx[i],len_of_indep_vars[i]- 2 )
179191 expr = :($ L* Q[$ j]* u[:,$ j])
180192 end
181193 end
182194 return expr
183195 elseif istree (input) && operation (input) isa Differential
184196 var = nameof (input. op. x)
185197 push! (deriv_var,var)
186- return discretize_2 (input. args [1 ],deriv_order+ 1 ,approx_order ,dx,X,
198+ return discretize_2 (arguments ( input) [1 ],deriv_order+ 1 ,upwind_order,centered_order ,dx,X,
187199 len_of_indep_vars,deriv_var,dep_var_idx,indep_var_idx)
188200 else
189201 name = nameof (operation (input))
190- if size (input. args ,1 ) == 1
191- aux = discretize_2 (input. args [1 ],deriv_order,approx_order ,dx,X,
202+ if size (arguments ( input) ,1 ) == 1
203+ aux = discretize_2 (arguments ( input) [1 ],deriv_order,upwind_order,centered_order ,dx,X,
192204 len_of_indep_vars,deriv_var,dep_var_idx,indep_var_idx)
193205 return :(broadcast ($ name, $ aux))
194206 else
195- aux_1 = discretize_2 (input. args [1 ],deriv_order,approx_order ,dx,X,
207+ aux_1 = discretize_2 (arguments ( input) [1 ],deriv_order,upwind_order,centered_order ,dx,X,
196208 len_of_indep_vars,deriv_var,dep_var_idx,indep_var_idx)
197- aux_2 = discretize_2 (input. args [2 ],deriv_order,approx_order ,dx,X,
209+ aux_2 = discretize_2 (arguments ( input) [2 ],deriv_order,upwind_order,centered_order ,dx,X,
198210 len_of_indep_vars,deriv_var,dep_var_idx,indep_var_idx)
199211 return :(broadcast ($ name, $ aux_1, $ aux_2))
200212 end
@@ -257,7 +269,8 @@ function DiffEqBase.discretize(pdesys::PDESystem,discretization::MOLFiniteDiffer
257269 # ## Declare and define dependent-variable data structures #################
258270
259271 # TODO : specify order for each derivative
260- approx_order = discretization. order
272+ upwind_order = discretization. upwind_order
273+ centered_order = discretization. centered_order
261274
262275 lhs_deriv_depvars = Dict ()
263276 dep_var_idx = Dict ()
@@ -282,7 +295,7 @@ function DiffEqBase.discretize(pdesys::PDESystem,discretization::MOLFiniteDiffer
282295 dep_var_idx[var] = j
283296 end
284297 for (var,j) in dep_var_idx
285- aux = discretize_2 ( eqs[j]. rhs,0 ,approx_order ,dx,X,len_of_indep_vars,
298+ aux = discretize_2 ( eqs[j]. rhs,0 ,upwind_order,centered_order ,dx,X,len_of_indep_vars,
286299 [],dep_var_idx,indep_var_idx)
287300 dep_var_disc[var] = @RuntimeGeneratedFunction (:((Q,u,t) -> $ aux))
288301 end
0 commit comments