def test_taylor_hood_cube(): pytest.xfail("Problem with Mixed Function Spaces") meshc = UnitCubeMesh(MPI.comm_world, 2, 2, 2) meshf = UnitCubeMesh(MPI.comm_world, 3, 4, 5) Ve = VectorElement("CG", meshc.ufl_cell(), 2) Qe = FiniteElement("CG", meshc.ufl_cell(), 1) Ze = MixedElement([Ve, Qe]) Zc = FunctionSpace(meshc, Ze) Zf = FunctionSpace(meshf, Ze) def z(x): return np.row_stack((x[0] * x[1], x[1] * x[2], x[2] * x[0], x[0] + 3.0 * x[1] + x[2])) zc, zf = Function(Zc), Function(Zf) zc.interpolate(z) zf.interpolate(z) mat = PETScDMCollection.create_transfer_matrix(Zc, Zf) Zuc = Function(Zf) mat.mult(zc.vector, Zuc.vector) Zuc.vector.update_ghost_values() diff = Function(Zf) diff.assign(Zuc - zf) assert diff.vector.norm("l2") < 1.0e-12
def test_assign(V, W): for V0, V1, vector_space in [(V, W, False), (W, V, True)]: u = Function(V0) u0 = Function(V0) u1 = Function(V0) u2 = Function(V0) u3 = Function(V1) u.vector[:] = 1.0 u0.vector[:] = 2.0 u1.vector[:] = 3.0 u2.vector[:] = 4.0 u3.vector[:] = 5.0 uu = Function(V0) uu.assign(2 * u) assert uu.vector.get_local().sum() == u0.vector.get_local().sum() uu = Function(V1) uu.assign(3 * u) assert uu.vector.get_local().sum() == u1.vector.get_local().sum() # Test complex assignment expr = 3 * u - 4 * u1 - 0.1 * 4 * u * 4 + u2 + 3 * u0 / 3. / 0.5 expr_scalar = 3 - 4 * 3 - 0.1 * 4 * 4 + 4. + 3 * 2. / 3. / 0.5 uu.assign(expr) assert (round( uu.vector.get_local().sum() - float(expr_scalar * uu.vector.size()), 7) == 0) # Test self assignment expr = 3 * u - 5.0 * u2 + u1 - 5 * u expr_scalar = 3 - 5 * 4. + 3. - 5 u.assign(expr) assert (round( u.vector.get_local().sum() - float(expr_scalar * u.vector.size()), 7) == 0) # Test zero assignment u.assign(-u2 / 2 + 2 * u1 - u1 / 0.5 + u2 * 0.5) assert round(u.vector.get_local().sum() - 0.0, 7) == 0 # Test erroneous assignments uu = Function(V1) def f(values, x): values[:, 0] = 1.0 with pytest.raises(RuntimeError): uu.assign(1.0) with pytest.raises(RuntimeError): uu.assign(4 * f) if not vector_space: with pytest.raises(RuntimeError): uu.assign(u * u0) with pytest.raises(RuntimeError): uu.assign(4 / u0) with pytest.raises(RuntimeError): uu.assign(4 * u * u1)