ub, vb = TrialFunction(Vb), TestFunction(Vb) b = [[0, 0], [0, 0]] b[0][0] = inner(grad(u), grad(v)) * dx + inner(u, v) * dx b[0][1] = inner(grad(ub), grad(v)) * dx + inner(ub, v) * dx b[1][0] = inner(grad(u), grad(vb)) * dx + inner(u, vb) * dx b[1][1] = inner(grad(ub), grad(vb)) * dx + inner(ub, vb) * dx BB = ii_assemble(b) x = Function(V).vector() x.set_local(np.random.rand(x.local_size())) y = Function(Vb).vector() y.set_local(np.random.rand(y.local_size())) bb = block_vec([x, y]) z_block = BB * bb # Make into a monolithic matrix BB_m = ii_convert(BB) R = ReductionOperator([2], W=[V, Vb]) z = (R.T) * BB_m * (R * bb) print(z - z_block).norm() y = BB_m * (R * bb) print np.linalg.norm( np.hstack([bi.get_local() for bi in z_block]) - y.get_local())
Vb = VectorFunctionSpace(mesh, 'Bubble', 3) u, v = TrialFunction(V), TestFunction(V) ub, vb = TrialFunction(Vb), TestFunction(Vb) b = [[0, 0], [0, 0]] b[0][0] = inner(grad(u), grad(v))*dx + inner(u, v)*dx b[0][1] = inner(grad(ub), grad(v))*dx + inner(ub, v)*dx b[1][0] = inner(grad(u), grad(vb))*dx + inner(u, vb)*dx b[1][1] = inner(grad(ub), grad(vb))*dx + inner(ub, vb)*dx BB = ii_assemble(b) x = Function(V).vector(); x.set_local(np.random.rand(x.local_size())) y = Function(Vb).vector(); y.set_local(np.random.rand(y.local_size())) bb = block_vec([x, y]) z_block = BB*bb # Make into a monolithic matrix BB_m = ii_convert(BB) R = ReductionOperator([2], W=[V, Vb]) z = (R.T)*BB_m*(R*bb) print (z - z_block).norm() y = BB_m*(R*bb) print np.linalg.norm(np.hstack([bi.get_local() for bi in z_block])-y.get_local())