MethodOfLines.jl icon indicating copy to clipboard operation
MethodOfLines.jl copied to clipboard

Mixed differentials

Open marcofrancis opened this issue 3 years ago • 5 comments

Do I understand correctly that right now it's not possible to use second order mixed derivatives when defining the equation to solve but one has to introduce an auxiliary variable?

If I modify slightly the Brusselator example as this:

using ModelingToolkit, MethodOfLines, OrdinaryDiffEq

@parameters x y t
@variables u(..) v(..)
Dt = Differential(t)
Dx = Differential(x)
Dy = Differential(y)
Dxx = Differential(x)^2
Dyy = Differential(y)^2

# MIXED DIFFERENTIAL
Dxy = Differential(x)*Differential(y)

∇²(u) = Dxx(u) + Dyy(u) + Dxy(u)

brusselator_f(x, y, t) = (((x-0.3)^2 + (y-0.6)^2) <= 0.1^2) * (t >= 1.1) * 5.

x_min = y_min = t_min = 0.0
x_max = y_max = 1.0
t_max = 11.5

α = 10.

u0(x,y,t) = 22(y*(1-y))^(3/2)
v0(x,y,t) = 27(x*(1-x))^(3/2)

eq = [Dt(u(x,y,t)) ~ 1. + v(x,y,t)*u(x,y,t)^2 - 4.4*u(x,y,t) + α*∇²(u(x,y,t)) + brusselator_f(x, y, t),
       Dt(v(x,y,t)) ~ 3.4*u(x,y,t) - v(x,y,t)*u(x,y,t)^2 + α*∇²(v(x,y,t))]

domains = [x ∈ Interval(x_min, x_max),
              y ∈ Interval(y_min, y_max),
              t ∈ Interval(t_min, t_max)]

# Periodic BCs
bcs = [u(x,y,0) ~ u0(x,y,0),
       u(0,y,t) ~ u(1,y,t),
       u(x,0,t) ~ u(x,1,t),

       v(x,y,0) ~ v0(x,y,0),
       v(0,y,t) ~ v(1,y,t),
       v(x,0,t) ~ v(x,1,t)] 

@named pdesys = PDESystem(eq,bcs,domains,[x,y,t],[u(x,y,t),v(x,y,t)])

N = 32

dx = (x_max-x_min)/N
dy = (y_max-y_min)/N

order = 2

discretization = MOLFiniteDifference([x=>dx, y=>dy], t, approx_order=order, grid_align=center_align)

# Convert the PDE problem into an ODE problem
prob = discretize(pdesys,discretization)

I get the following error:

ERROR: MethodError: no method matching collect_ivs_from_nested_operator!(::Set{Any}, ::SymbolicUtils.Add{Real, Int64, Dict{Any, Number}, Nothing}, ::Type{Differential})
Closest candidates are:
  collect_ivs_from_nested_operator!(::Any, ::Term, ::Any)

marcofrancis avatar Jul 19 '22 12:07 marcofrancis

Thinking about it there is no way to get them to discretize at present, sorry. I will add this to known limitations. We can eventually support this, but don't expect it until after v1.0.

Though I invite you to try an auxiliary variable.

xtalax avatar Jul 19 '22 14:07 xtalax

Wait, can't I just add a new unknown function that represents the first derivative wrt one of the state space variables, and add an equation for it?

marcofrancis avatar Jul 19 '22 16:07 marcofrancis

Actually yes, good point! Let me know if that works.

xtalax avatar Jul 20 '22 14:07 xtalax

I fell into the same issue. Trying to see if a workaround with auxiliary variables can work.

henry2004y avatar Jul 22 '22 09:07 henry2004y

#145 related

xtalax avatar Jul 28 '22 16:07 xtalax