Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Complex2.1 #343

Merged
merged 5 commits into from
Dec 5, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/CI.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ jobs:
- Brusselator
- Mixed_Derivatives
- Wave_Eq_Staggered
- Complex
version:
- '1'
- '1.6'
Expand Down
2 changes: 1 addition & 1 deletion Project.toml
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ Interpolations = "0.14"
Latexify = "0.15, 0.16"
ModelingToolkit = "8"
OrdinaryDiffEq = "6"
PDEBase = "0.1.6"
PDEBase = "0.1.8"
PrecompileTools = "1"
RuntimeGeneratedFunctions = "0.5.9"
SafeTestsets = "0.0.1"
Expand Down
1 change: 1 addition & 0 deletions docs/pages.jl
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ pages = [
"tutorials/sispde.md",
"tutorials/icbc_sampled.md",
"tutorials/PIDE.md",
"tutorials/schroedinger.md",
],
"Performance Tips" => "performance.md",
"MOLFiniteDifference" => "MOLFiniteDifference.md",
Expand Down
48 changes: 48 additions & 0 deletions docs/src/tutorials/schroedinger.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
# Schrödinger Equation

MethodOfLines can solve linear complex PDEs like the Scrödinger equation:

```@example schro
using MethodOfLines, OrdinaryDiffEq, Plots, DomainSets, ModelingToolkit

@parameters t, x
@variables ψ(..)

Dt = Differential(t)
Dxx = Differential(x)^2

xmin = 0
xmax = 1

V(x) = 0.0

eq = [im*Dt(ψ(t,x)) ~ Dxx(ψ(t,x)) + V(x)*ψ(t,x)] # You must enclose complex equations in a vector, even if there is only one equation

ψ0 = x -> sin(2pi*x)

bcs = [ψ(0,x) ~ ψ0(x),
ψ(t,xmin) ~ 0,
ψ(t,xmax) ~ 0]

domains = [t ∈ Interval(0, 1), x ∈ Interval(xmin, xmax)]

@named sys = PDESystem(eq, bcs, domains, [t, x], [ψ(t,x)])

disc = MOLFiniteDifference([x => 100], t)

prob = discretize(sys, disc)

sol = solve(prob, TRBDF2(), saveat = 0.01)

discx = sol[x]
disct = sol[t]

discψ = sol[ψ(t, x)]
anim = @animate for i in 1:length(disct)
u = discψ[i, :]
plot(discx, [real.(u), imag.(u)], ylim = (-1.5, 1.5), title = "t = $(disct[i])", xlabel = "x", ylabel = "ψ(t,x)", label = ["re(ψ)" "im(ψ)"], legend = :topleft)
end
gif(anim, "schroedinger.gif", fps = 10)
```

This represents the second from ground state of a particle in an infinite quantum well, try changing the potential `V(x)`, initial conditions and BCs, it is extremely interesting to see how the wave function evolves even for nonphysical combinations. Be sure to post interesting results on the discourse!
1 change: 0 additions & 1 deletion src/interface/solution/timedep.jl
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,6 @@ function SciMLBase.PDETimeSeriesSolution(sol::SciMLBase.AbstractODESolution{T},
end |> Dict
# Build Interpolations
interp = build_interpolation(umap, dvs, ivs, ivgrid, sol, pdesys, discretespace.vars.replaced_vars)
@show metadata.complexmap

return SciMLBase.PDETimeSeriesSolution{T,length(discretespace.ū),typeof(umap),typeof(metadata),
typeof(sol),typeof(sol.errors),typeof(sol.t),typeof(ivgrid),
Expand Down
55 changes: 55 additions & 0 deletions test/pde_systems/schroedinger.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
using MethodOfLines, OrdinaryDiffEq, DomainSets, ModelingToolkit, Test

@parameters t, x
@variables ψ(..)

Dt = Differential(t)
Dxx = Differential(x)^2

xmin = 0
xmax = 1

V(x) = 0.0

eq = [im*Dt(ψ(t,x)) ~ (Dxx(ψ(t,x)) + V(x)*ψ(t,x))] # You must enclose complex equations in a vector, even if there is only one equation

ψ0 = x -> sin(2*pi*x)

bcs = [ψ(0,x) ~ ψ0(x),
ψ(t,xmin) ~ 0,
ψ(t,xmax) ~ 0]

domains = [t ∈ Interval(0, 1), x ∈ Interval(xmin, xmax)]

@named sys = PDESystem(eq, bcs, domains, [t, x], [ψ(t,x)])

disc = MOLFiniteDifference([x => 100], t)

prob = discretize(sys, disc)

sol = solve(prob, TRBDF2(), saveat = 0.01)

discx = sol[x]
disct = sol[t]

discψ = sol[ψ(t, x)]

analytic(t, x) = sqrt(2)*sin(2*pi*x)*exp(-im*4*pi^2*t)

analψ = [analytic(t, x) for t in disct, x in discx]

for i in 1:length(disct)
u = abs.(analψ[i, :]).^2
u2 = abs.(discψ[i, :]).^2

@test u./maximum(u) ≈ u2./maximum(u2) atol=1e-3
end

#using Plots

# anim = @animate for i in 1:length(disct)
# u = analψ[i, :]
# u2 = discψ[i, :]
# plot(discx, [real.(u), imag.(u)], ylim = (-1.5, 1.5), title = "t = $(disct[i])", xlabel = "x", ylabel = "ψ(t,x)", label = ["re(ψ)" "im(ψ)"], legend = :topleft)
# end
# gif(anim, "schroedinger.gif", fps = 10)
6 changes: 6 additions & 0 deletions test/runtests.jl
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,12 @@ const is_TRAVIS = haskey(ENV, "TRAVIS")
# Start Test Script

@time begin
if GROUP == "All" || GROUP == "Complex"
@time @safetestset "MOLFiniteDifference Interface" begin
include("pde_systems/schroedinger.jl")
end
end

if GROUP == "All" || GROUP == "Mixed_Derivatives"
@time @safetestset "MOLFiniteDifference Interface: Mixed Derivatives" begin
include("pde_systems/MOL_Mixed_Deriv.jl")
Expand Down
Loading