In the demo on spectral methods found at
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 - x 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) 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.