Advertisement
Guest User

Untitled

a guest
Nov 21st, 2019
219
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Julia 3.25 KB | None | 0 0
  1. using Revise
  2.     using DiffEqOperators
  3.     using LinearAlgebra, Plots, SparseArrays, Parameters, Setfield
  4.     using DifferentialEquations, DiffEqOperators, Sundials
  5.  
  6. plotsol(x; kwargs...) = plot(heatmap(reshape(real.(x[1:div(length(x),2)]), Nx, Ny)',color=:viridis; kwargs...), heatmap(reshape(real.(x[div(length(x),2)+1:end]), Nx, Ny)',color=:viridis; kwargs...))
  7. norminf = x -> norm(x, Inf)
  8.  
  9. function Laplacian2D(Nx, Ny, lx, ly, bc = :Dirichlet)
  10.     hx = 2lx/Nx
  11.     hy = 2ly/Ny
  12.     D2x = CenteredDifference(2, 2, hx, Nx)
  13.     D2y = CenteredDifference(2, 2, hy, Ny)
  14.     if bc == :Neumann
  15.         Qx = Neumann0BC(hx)
  16.         Qy = Neumann0BC(hy)
  17.     else
  18.         Qx = Dirichlet0BC(typeof(hx))
  19.         Qy = Dirichlet0BC(typeof(hy))
  20.     end
  21.     A = kron(sparse(I, Ny, Ny), sparse(D2x * Qx)[1]) + kron(sparse(D2y * Qy)[1], sparse(I, Nx, Nx))
  22.     return A, D2x
  23. end
  24.  
  25. function Fcgl(u, p)
  26.     @unpack r, μ, ν, c3, c5, Δ = p
  27.     n = div(length(u), 2)
  28.     u1 = @view u[1:n]
  29.     u2 = @view u[n+1:2n]
  30.  
  31.     ua = u1.^2 .+ u2.^2
  32.  
  33.     f = similar(u)
  34.     f1 = @view f[1:n]
  35.     f2 = @view f[n+1:2n]
  36.  
  37.     mul!(f, Δ, u)
  38.  
  39.     @. f1 .+= r * u1 - ν * u2 - ua * (c3 * u1 - μ * u2) - c5 * ua^2 * u1
  40.     @. f2 .+= r * u2 + ν * u1 - ua * (c3 * u2 + μ * u1) - c5 * ua^2 * u2
  41.  
  42.     return f
  43. end
  44.  
  45. # remark: I checked this against finite differences
  46. function Jcgl(u, p)
  47.     @unpack r, μ, ν, c3, c5, Δ = p
  48.  
  49.     n = div(length(u), 2)
  50.     u1 = @view u[1:n]
  51.     u2 = @view u[n+1:2n]
  52.  
  53.     ua = u1.^2 .+ u2.^2
  54.  
  55.     f1u = zero(u1)
  56.     f2u = zero(u1)
  57.     f1v = zero(u1)
  58.     f2v = zero(u1)
  59.  
  60.     @. f1u =  r - 2 * u1 * (c3 * u1 - μ * u2) - c3 * ua - 4 * c5 * ua * u1^2 - c5 * ua^2
  61.     @. f1v = -ν - 2 * u2 * (c3 * u1 - μ * u2)  + μ * ua - 4 * c5 * ua * u1 * u2
  62.     @. f2u =  ν - 2 * u1 * (c3 * u2 + μ * u1)  - μ * ua - 4 * c5 * ua * u1 * u2
  63.     @. f2v =  r - 2 * u2 * (c3 * u2 + μ * u1) - c3 * ua - 4 * c5 * ua * u2 ^2 - c5 * ua^2
  64.  
  65.     jacdiag = vcat(f1u, f2v)
  66.  
  67.     Δ + spdiagm(0 => jacdiag, n => f1v, -n => f2u)
  68. end
  69.  
  70. function FOde(f, x, p, t)
  71.     f .= Fcgl(x, p)
  72. end
  73.  
  74. function JacOde(J, x, p, t)
  75.     Jcgl = Jcgl(x, p)
  76.     @show typeof(J) typeof(Jcgl)
  77.     copyto!(J, Jcgl)
  78. end
  79.  
  80. Nx = 41*1
  81.     Ny = 21*1
  82.     lx = pi
  83.     ly = pi/2
  84.  
  85.     Δ = Laplacian2D(Nx, Ny, lx, ly)[1]
  86.     par_cgl = (r = 0.5, μ = 0.1, ν = 1.0, c3 = -1.0, c5 = 1.0, Δ = kron(spdiagm(0 => ones(2)), Δ))
  87.     sol0 = zeros(2Nx, Ny)
  88.  
  89. function FOde(f, x, p, t)
  90.     f .= Fcgl(x, p)
  91. end
  92.  
  93. function JacOde(J, x, p, t)
  94.     Jsp = Jcgl(x, p)
  95.     @show typeof(J) typeof(Jsp)
  96.     copyto!(J, Jsp)
  97. end
  98.  
  99. u0 = rand(2Nx*Ny)
  100. ff = ODEFunction(FOde, jac = JacOde, jac_prototype = par_cgl.Δ)#jac_prototype = JacVecOperator{Float64}(FOde, u0, p))
  101. prob = ODEProblem(ff, u0, (0., 2.), (@set par_cgl.r = 1.55 + 0.))
  102. sol = @time solve(prob, Tsit5())#,save_everystep=false)
  103. sol = @time solve(prob, CVODE_BDF(linear_solver=:GMRES))#,save_everystep=false)
  104. sol = @time solve(prob, TRBDF2(linsolve=LinSolveGMRES()))#,save_everystep=false)
  105. sol = @time solve(prob, TRBDF2())#,save_everystep=false)
  106.  
  107. heatmap(sol[:,:])
  108.  
  109. using ForwardDiff
  110. function test_f(u0)
  111.     println("#"^10)
  112.     @show typeof(u0) eltype(u0)
  113.     _prob = remake(prob; u0=u0)#, jac_prototype = convert.(ForwardDiff.Dual{ForwardDiff.Tag{typeof(test_f),Float64},Float64,12}, par_cgl.Δ))
  114.     @show typeof(_prob.f.jac_prototype)
  115.  
  116.     solve(_prob,TRBDF2(),save_everystep=false)[end]
  117. end
  118.  
  119. fd_res = ForwardDiff.jacobian(test_f, u0)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement