Re: [firedrake] Solve no longer applies BC's to pre-assembled matrices
Hi Peter, It appears our documentation is lagging development here. The ability to add boundary conditions after assembling a matrix was removed recently, basically because it causes a lot of complication under the hood and doesn’t really add any functionality. If you want to pre-assemble systems for some reason (and there is usually no reason to do this), then you should apply the boundary conditions at assembly time. Regards, David From: <firedrake-bounces@imperial.ac.uk> on behalf of "Sentz, Peter" <psentz@sandia.gov> Date: Monday, 1 July 2019 at 23:44 To: firedrake <firedrake@imperial.ac.uk> Subject: [firedrake] Solve no longer applies BC's to pre-assembled matrices It appears to me that passing in boundary conditions in the solve command when using pre-assembled matrices is not working correctly. Consider the following problem: ************************************************** mesh = UnitSquareMesh(10,10) V = FunctionSpace(mesh,'CG',1) x,y = SpatialCoordinate(mesh) f_ex = 10.*exp(-(x-0.5)**2/0.02 - (y-0.5)**2/0.02) f = interpolate(f_ex,V) g_ex = sin(5*x) g = interpolate(g_ex,V) u, v = TrialFunction(V), TestFunction(V) bc = DirichletBC(V,0.0,(1,2)) A = assemble(inner(grad(u),grad(v))*dx,bcs=bc) b = assemble(f*v*dx + g*v*ds((3,4)),bcs=bc) U_1 = Function(V) solve(A,U_1,b) A = assemble(inner(grad(u),grad(v))*dx) b = assemble(f*v*dx + g*v*ds((3,4))) U_2 = Function(V) solve(A,U_2,b,bcs=bc) A = inner(grad(u),grad(v))*dx b = f*v*dx + g*v*ds((3,4)) U_3 = Function(V) solve(A==b,U_3,bcs=bc) **************************************************** The solve commands for U_1 and U_3 both converge, and the solutions agree to within machine precision. However, Firedrake fails to solve for U_2, with the error message: ConvergenceError: ('LinearSolver failed to converge after %d iterations with reason: %s', 1320, 'DIVERGED_DTOL' I suspect that boundary conditions are not being applied in the second solve command to the pre-assembled system. But according to the documentation on firedrakeproject.org, this should work as coded above. Am I doing something incorrectly? I'm also wondering how this would affect LinearVariationalSolver if there is indeed a problem with the boundary conditions. Thanks, Peter Sentz
participants (1)
- 
                
                Ham, David A