Skip to content

Commit ced3fc7

Browse files
committed
Fix ranges of the solution vector
1 parent cd4d3cd commit ced3fc7

File tree

1 file changed

+22
-2
lines changed

1 file changed

+22
-2
lines changed

src/solvers.jl

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -361,7 +361,19 @@ function CommonSolve.solve(PD::ProblemDescription, FES::Union{<:FESpace, Vector{
361361
push!(stats[:matrix_nnz], nnz(linsolve.A))
362362
Δx = LinearSolve.solve!(linsolve)
363363

364-
x = sol.entries - Δx.u
364+
# x = sol.entries - Δx.u for free dofs or partial solutions
365+
if length(freedofs) > 0
366+
x = sol.entries[freedofs] - Δx.u
367+
else
368+
x = zero(Δx)
369+
offset = 0
370+
for u in unknowns
371+
ndofs_u = length(view(sol[u]))
372+
x_range = (offset + 1):(offset + ndofs_u)
373+
x[x_range] .= view(sol[u]) .- view(Δx, x_range)
374+
offset += ndofs_u
375+
end
376+
end
365377

366378
## check linear residual with full matrix
367379
if length(freedofs) > 0
@@ -656,7 +668,15 @@ function iterate_until_stationarity(
656668
## solve
657669
Δx = LinearSolve.solve!(linsolve)
658670

659-
x = sol.entries - Δx.u
671+
# x = sol.entries - Δx.u ... in the entry ranges of the present unknowns
672+
x = zero(Δx.u)
673+
offset = 0
674+
for u in unknowns[p]
675+
ndofs_u = length(view(sol[u]))
676+
x_range = (offset + 1):(offset + ndofs_u)
677+
x[x_range] .= view(sol[u]) .- view(Δx.u, x_range)
678+
offset += ndofs_u
679+
end
660680

661681
fill!(residual.entries, 0)
662682
mul!(residual.entries, A.entries.cscmatrix, x)

0 commit comments

Comments
 (0)