In the demo on spectral methods found at
https://docs.sciml.ai/SciMLBenchmarksOutput/stable/MOLPDE/burgers_spectral_wpd/
there is a call to Fourier()
. I cannot figure out which module
it is in. Could somebody please let me know? Also, what is the best way to find that module that contains a particular method is the module is not yet `added via the package manager.
Here is my own pseudo spectral code to solve Burger’s equation using Euler
method, although I can obviously upgrade to any temporal solver for higher order results:
using Plots
using FFTW
# Solve Burger's equation via pseudospectral method.
# Use periodic boundary conditons
# u_t + u u_x = ν u_xx
# Let uhat = F(u) be the Fourier transform of u
# In Fourier space, Burgers equation becomes
# uhat_t + i k uhat = ν k^2 uhat
# Given uhat, its spatial derivative is given by
# uhat_x = i k uhat
# Define the domain
Lx = 2π
Nx = 512
# Periodic x domain
x = range(0, Lx, length=Nx+1)[1:end-1]
dx = x[2] - x[1]
T = 1.0
Nt = 400
dt = T / Nt
μ = 0.01
u0 = sin.(3 .* x)
frequ = fftfreq(129)*129 |> collect
# Functions to simoplify Collocation method
function derivs(u, freq)
uhat = rfft(u)
uhatk = im .* freq .* uhat
uhatkk = -freq.^2 .* uhat
ux = irfft(uhatk, length(u))
uxx = irfft(uhatkk, length(u))
return ux, uxx
end
u0 = sin.(1 .* x)
Nh = div(Nx, 2) + 1
frequ = fftfreq(Nh)*Nh |> collect
ux, uxx = derivs(u0, frequ)
plot(u0)
plot!(ux)
plot!(uxx / 9.)
# Euler
# Save solution ever step iterations for plotitng
nstep = 1
# usave: list of solution
usave = []
sol = zeros(Float64, Nx, Nt)
sol[:, 1] = u0
push!(usave, copy(u0));
u = copy(u0)
for i in 2:Nt
ux, uxx = derivs(u, frequ)
u .= u + dt .* (μ * uxx - u .* ux)
if i % nstep == 0
sol[:,i] = copy(u)
push!(usave, copy(u))
end
end
plot(x, usave[1])
for i in 2:20:400
p = plot!(x, usave[i], c=:red, alpha=i/400)
display(p)
end
Any improvements to this code are welcome. It runs extremely fast.