210: 2D Nonlinear Poisson with reaction
module Example210_NonlinearPoisson2D_Reactionusing Printfusing VoronoiFVMusing ExtendableGridsusing GridVisualizeusing LinearSolve, ExtendableSparseimport Metisfunction main(; n = 10, Plotter = nothing, verbose = false, unknown_storage = :sparse, assembly = :edgewise, tstep = 0.01 ) X = range(0, 1, length = n + 1) Y = range(0, 1, length = n + 1) grid = simplexgrid(X, Y)grid = partition(grid, PlainMetisPartitioning(npart = 10))
@show grid data = (eps = 1.0e-2, k = 1.0) function reaction!(f, u, node, data) f[1] = data.k * (u[1] - u[2]) f[2] = data.k * (u[2] - u[1]) return nothing end function flux!(f, u, edge, data) f[1] = data.eps * (u[1, 1] - u[1, 2]) f[2] = data.eps * (u[2, 1] - u[2, 2]) return nothing end function source!(f, node, data) x1 = node[1] - 0.5 x2 = node[2] - 0.5 f[1] = exp(-20 * (x1^2 + x2^2)) return nothing end function storage!(f, u, node, data) f[1] = u[1] f[2] = u[2] return nothing end sys = VoronoiFVM.System( grid; data, flux = flux!, storage = storage!, reaction = reaction!, source = source!, unknown_storage = unknown_storage, assembly = assembly ) enable_species!(sys, 1, [1]) enable_species!(sys, 2, [1]) inival = unknowns(sys) inival .= 0.0 control = VoronoiFVM.SolverControl(; verbose, Δt = tstep, Δt_min = tstep, Δt_max = tstep, Δu_opt = 1.0e5, method_linear = KrylovJL_BICGSTAB(precs = LinearSolvePreconBuilder(UMFPACKFactorization())), factorize_every_timestep = 2 ) p = GridVisualizer(; Plotter = Plotter, layout = (2, 1)) function post(U, Uold, t, Δt) scalarplot!(p[1, 1], grid, U[1, :]; clear = true, limits = (0, 0.5)) scalarplot!(p[2, 1], grid, U[2, :]; show = true, limits = (0, 0.5)) return end tsol = solve(sys; inival, times = (0, 1), control, post) testval = sum(tsol.u[end]) return testvalendusing Testfunction runtests() testval = 16.01812472041518 @test main(; unknown_storage = :sparse, assembly = :edgewise) ≈ testval && main(; unknown_storage = :dense, assembly = :edgewise) ≈ testval && main(; unknown_storage = :sparse, assembly = :cellwise) ≈ testval && main(; unknown_storage = :dense, assembly = :cellwise) ≈ testval return nothingendendThis page was generated using Literate.jl.