Skip to content

Commit 172be3d

Browse files
authored
residual in solve until stationarity solver are saved now (#115)
* residual in solve until stationarity solver are saved now and can be extracted from statistics, printing now verbosity dependent * use residuals in tests of Example280
1 parent 272db1a commit 172be3d

4 files changed

Lines changed: 31 additions & 6 deletions

File tree

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
# CHANGES
22

33

4+
## v.1.10.5
5+
6+
### Fixed
7+
- linear and nonlinear residuals in solve_until_stationarity are saved in SolverConfiguration.statistics
8+
9+
410
## v.1.10.4
511

612
### Fixed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name = "ExtendableFEM"
22
uuid = "a722555e-65e0-4074-a036-ca7ce79a4aed"
3-
version = "1.10.4"
3+
version = "1.10.5"
44
authors = ["Christian Merdon <merdon@wias-berlin.de>", "Patrick Jaap <patrick.jaap@wias-berlin.de>"]
55

66
[deps]

examples/Example280_CompressibleStokes.jl

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ function main(;
130130
EnergyIntegrator = ItemIntegrator(energy_kernel!, [id(u)]; resultdim = 1, quadorder = 2 * (order + 1), kwargs...)
131131
ErrorIntegratorExact = ItemIntegrator(exact_error!(u!, ∇u!, ϱ!), [id(u), grad(u), id(ϱ)]; resultdim = 9, quadorder = 2 * (order + 1), kwargs...)
132132
NDofs = zeros(Int, nrefs)
133-
Results = zeros(Float64, nrefs, 5)
133+
Results = zeros(Float64, nrefs, 7)
134134

135135
sol = nothing
136136
xgrid = nothing
@@ -152,13 +152,20 @@ function main(;
152152
SC2 = SolverConfiguration(PDT; init = sol, maxiterations = 1, target_residual = target_residual, kwargs...)
153153
sol, nits = iterate_until_stationarity([SC1, SC2]; energy_integrator = EnergyIntegrator, maxsteps = maxsteps, init = sol, kwargs...)
154154

155+
residual_momentum = residual(SC1)
156+
residual_continuity = residual(SC2)
157+
@info "final residual momentum = $(residual_momentum)"
158+
@info "final residual continuity = $(residual_continuity)"
159+
155160
## calculate error
156161
error = evaluate(ErrorIntegratorExact, sol)
157162
Results[lvl, 1] = sqrt(sum(view(error, 1, :)) + sum(view(error, 2, :)))
158163
Results[lvl, 2] = sqrt(sum(view(error, 3, :)) + sum(view(error, 4, :)) + sum(view(error, 5, :)) + sum(view(error, 6, :)))
159164
Results[lvl, 3] = sqrt(sum(view(error, 7, :)))
160165
Results[lvl, 4] = sqrt(sum(view(error, 8, :)) + sum(view(error, 9, :)))
161166
Results[lvl, 5] = nits
167+
Results[lvl, 6] = residual_momentum
168+
Results[lvl, 7] = residual_continuity
162169

163170
## print results
164171
print_convergencehistory(NDofs[1:lvl], Results[1:lvl, :]; X_to_h = X -> X .^ (-1 / 2), ylabels = ["|| u - u_h ||", "|| ∇(u - u_h) ||", "|| ϱ - ϱ_h ||", "|| ϱu - ϱu_h ||", "#its"], xlabel = "ndof")
@@ -328,6 +335,8 @@ end
328335
generateplots = ExtendableFEM.default_generateplots(Example280_CompressibleStokes, "example280.png") #hide
329336
function runtests() #hide
330337
Results, plt = main(; nrefs = 2) #hide
338+
@test Results[end, 6] <= 1.0e-11 #hide
339+
@test Results[end, 7] <= 1.0e-11 #hide
331340
@test Results[end, 1] 6.732891488265023e-7 #hide
332341
return nothing #hide
333342
end #hide

src/solvers.jl

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -868,11 +868,14 @@ function iterate_until_stationarity(
868868
allocs_final = 0
869869
nlres = 1.1e30
870870
linres = 1.1e30
871+
verbosity = maximum([SC.parameters[:verbosity] for SC in SCs])
871872
converged = zeros(Bool, nPDs)
872873
it::Int = 0
873874
while (it < maxsteps) && (any(converged .== false))
874875
it += 1
875-
@printf "%5d\t" it
876+
if verbosity > -2
877+
@printf "%5d\t" it
878+
end
876879
copyto!(init.entries, sol.entries)
877880
allocs_assembly = 0
878881
time_assembly = 0
@@ -884,6 +887,7 @@ function iterate_until_stationarity(
884887
A = As[p]
885888
PD = PDs[p]
886889
SC = SCs[p]
890+
stats = SC.statistics
887891
residual = residuals[p]
888892
maxits = SC.parameters[:maxiterations]
889893
nltol = SC.parameters[:target_residual]
@@ -923,7 +927,10 @@ function iterate_until_stationarity(
923927
end
924928
end
925929
nlres = norm(residual.entries)
926-
@printf "\tres[%d] = %.2e" p nlres
930+
if verbosity > -2
931+
@printf "\tres[%d] = %.2e" p nlres
932+
end
933+
push!(stats[:nonlinear_residuals], nlres)
927934
end
928935
time_final += time_assembly + time_solve_init
929936
allocs_final += allocs_assembly + allocs_solve_init
@@ -944,15 +951,18 @@ function iterate_until_stationarity(
944951
allocs_final += allocs_solve
945952
time_solve += time_solve_init
946953
allocs_solve += allocs_solve_init
947-
if SC.parameters[:verbosity] > -1
954+
if verbosity > -1
948955
@printf " (%.3e)" linres
949956
end
957+
push!(stats[:linear_residuals], linres)
950958
end # nonlinear iterations subproblem
951959
end
952960

953961
if energy_integrator !== nothing
954962
error = evaluate(energy_integrator, sol)
955-
@printf " energy = %.3e" sum([sum(view(error, j, :)) for j in 1:size(error, 1)])
963+
if verbosity > -1
964+
@printf " energy = %.3e" sum([sum(view(error, j, :)) for j in 1:size(error, 1)])
965+
end
956966
end
957967
@printf "\n"
958968
end

0 commit comments

Comments
 (0)