@@ -43,67 +43,97 @@ const dx = 1 / (N + 1) # Grid-spacing
4343x = LinRange (0.0 + dx, 1.0 - dx, N)
4444u₀ = sin .(x .* π)
4545
46+ lines (x, u₀, label = " Inital guess" )
47+
4648# ## Reference solution evaluated over domain
4749reference = true_sol_bratu .(x)
4850
49- # ## Solving using inplace and out-of-place variants
50- uₖ_1 = newton_krylov! (
51+ f, ax = lines (x, u₀, label = " Inital guess" )
52+ lines! (ax, x, reference, label = " Reference solution" )
53+ axislegend (ax, position = :cb )
54+ f
55+
56+ # ## Solving using inplace variant and CG
57+ uₖ, _ = newton_krylov! (
5158 (res, u) -> bratu! (res, u, dx, λ),
5259 copy (u₀), similar (u₀);
5360 Solver = CgSolver,
5461)
5562
56- uₖ_2 = newton_krylov (
63+ ϵ = abs2 .(uₖ .- reference)
64+
65+ let
66+ fig = Figure (size = (800 , 800 ))
67+ ax = Axis (fig[1 , 1 ], title = " " , ylabel = " " , xlabel = " " )
68+
69+ lines! (ax, x, reference, label = " True solution" )
70+ lines! (ax, x, u₀, label = " Initial guess" )
71+ lines! (ax, x, uₖ, label = " Newton-Krylov solution" )
72+
73+ axislegend (ax, position = :cb )
74+
75+ ax = Axis (fig[1 , 2 ], title = " Error" , ylabel = " abs2 err" , xlabel = " " )
76+ lines! (ax, abs2 .(uₖ .- reference))
77+
78+ fig
79+ end
80+
81+ # ## Solving using the out of place variant
82+
83+ _, stats = newton_krylov (
5784 (u) -> bratu (u, dx, λ),
5885 copy (u₀);
5986 Solver = CgSolver
6087)
61-
62- ϵ1 = abs2 .(uₖ_1 .- reference)
63- ϵ2 = abs2 .(uₖ_1 .- reference)
88+ stats
6489
6590# ## Solving with a fixed forcing
66- newton_krylov! (
91+ _, stats = newton_krylov! (
6792 (res, u) -> bratu! (res, u, dx, λ),
6893 copy (u₀), similar (u₀);
6994 Solver = CgSolver,
70- forcing = NewtonKrylov. Fixed ()
95+ forcing = NewtonKrylov. Fixed (0.1 )
7196)
97+ stats
7298
7399# ## Solving with no forcing
74- newton_krylov! (
100+ _, stats = newton_krylov! (
75101 (res, u) -> bratu! (res, u, dx, λ),
76102 copy (u₀), similar (u₀);
77103 Solver = CgSolver,
78104 forcing = nothing
79105)
106+ stats
80107
81- # ## Solve using GMRES -- very slow
108+ # ## Solve using GMRES -- doesn't converge
82109# ```julia
83- # @time newton_krylov!(
84- # (res, u) -> bratu!(res, u, dx, λ),
85- # copy(u₀), similar(u₀);
86- # Solver = GmresSolver,
110+ # _, stats = newton_krylov!(
111+ # (res, u) -> bratu!(res, u, dx, λ),
112+ # copy(u₀), similar(u₀);
113+ # Solver = GmresSolver,
87114# )
115+ # stats
88116# ```
89117
90118# ## Solve using GMRES + ILU Preconditoner
91- @time newton_krylov! (
119+ _, stats = newton_krylov! (
92120 (res, u) -> bratu! (res, u, dx, λ),
93121 copy (u₀), similar (u₀);
94122 Solver = GmresSolver,
95123 N = (J) -> ilu (collect (J)), # Assembles the full Jacobian
96- ldiv = true ,
124+ krylov_kwargs = (; ldiv = true )
97125)
126+ stats
98127
99128# ## Solve using FGMRES + ILU Preconditoner
100- @time newton_krylov! (
129+ _, stats = newton_krylov! (
101130 (res, u) -> bratu! (res, u, dx, λ),
102131 copy (u₀), similar (u₀);
103132 Solver = FgmresSolver,
104133 N = (J) -> ilu (collect (J)), # Assembles the full Jacobian
105- ldiv = true ,
134+ krylov_kwargs = (; ldiv = true )
106135)
136+ stats
107137
108138# ## Solve using FGMRES + GMRES Preconditoner
109139struct GmresPreconditioner{JOp}
@@ -116,20 +146,21 @@ function LinearAlgebra.mul!(y, P::GmresPreconditioner, x)
116146 return copyto! (y, sol)
117147end
118148
119- @time newton_krylov! (
149+ _, stats = newton_krylov! (
120150 (res, u) -> bratu! (res, u, dx, λ),
121151 copy (u₀), similar (u₀);
122152 Solver = FgmresSolver,
123- N = (J) -> GmresPreconditioner (J, 30 ),
153+ N = (J) -> GmresPreconditioner (J, 5 ),
124154)
155+ stats
125156
126157# ## Explodes..
127158# ```julia
128159# newton_krylov!(
129160# (res, u) -> bratu!(res, u, dx, λ),
130161# copy(u₀), similar(u₀);
131- # verbose = 1,
132162# Solver = CglsSolver, # CgneSolver
163+ # krylov_kwargs = (; verbose=1)
133164# )
134165# ```
135166#
138169# (res, u) -> bratu!(res, u, dx, λ),
139170# copy(u₀), similar(u₀);
140171# verbose = 1,
141- # Solver = BicgstabSolver,
172+ # Solver = BicgstabSolver, # L=2
142173# η_max = nothing
143174# )
144175# ```
0 commit comments