def test_fenics_vector(): def mult_assemble(a, basis): return MultiplicationOperator(a(0), basis) mean_func = ConstFunction(2) a = [ConstFunction(3), ConstFunction(4)] rvs = [UniformRV(), NormalRV(mu=0.5)] coeff_field = ListCoefficientField(mean_func, a, rvs) A = MultiOperator(coeff_field, mult_assemble) mis = [Multiindex([0]), Multiindex([1]), Multiindex([0, 1]), Multiindex([0, 2])] mesh = UnitSquare(4, 4) fs = FunctionSpace(mesh, "CG", 4) F = [interpolate(Expression("*".join(["x[0]"] * i)), fs) for i in range(1, 5)] vecs = [FEniCSVector(f) for f in F] w = MultiVectorWithProjection() for mi, vec in zip(mis, vecs): w[mi] = vec v = A * w L = LegendrePolynomials(normalised=True) H = StochasticHermitePolynomials(mu=0.5, normalised=True) ex0 = Expression("2*x[0] + 3*(l01*x[0]*x[0]-l00*x[0]) + 4*(h01*x[0]*x[0]*x[0]-h00*x[0])", l01=L.get_beta(0)[1], l00=L.get_beta(0)[0], h01=H.get_beta(0)[1], h00=H.get_beta(0)[0]) vec0 = FEniCSVector(interpolate(ex0, fs)) assert_almost_equal(v[mis[0]].array, vec0.array) # ====================================================================== # test with different meshes # ====================================================================== N = len(mis) meshes = [UnitSquare(i + 3, i + 3) for i in range(N)] fss = [FunctionSpace(mesh, "CG", 4) for mesh in meshes] F = [interpolate(Expression("*".join(["x[0]"] * (i + 1))), fss[i]) for i in range(N)] vecs = [FEniCSVector(f) for f in F] w = MultiVectorWithProjection() for mi, vec in zip(mis, vecs): w[mi] = vec v = A * w L = LegendrePolynomials(normalised=True) H = StochasticHermitePolynomials(mu=0.5, normalised=True) ex0 = Expression("2*x[0] + 3*(l01*x[0]*x[0]-l00*x[0]) + 4*(h01*x[0]*x[0]*x[0]-h00*x[0])", l01=L.get_beta(0)[1], l00=L.get_beta(0)[0], h01=H.get_beta(0)[1], h00=H.get_beta(0)[0]) ex2 = Expression("2*x[0]*x[0]*x[0] + 4*(h11*x[0]*x[0]*x[0]*x[0] - h10*x[0]*x[0]*x[0] + h1m1*x[0])", h11=H.get_beta(1)[1], h10=H.get_beta(1)[0], h1m1=H.get_beta(1)[-1]) vec0 = FEniCSVector(interpolate(ex0, fss[0])) vec2 = FEniCSVector(interpolate(ex2, fss[2])) assert_almost_equal(v[mis[0]].array, vec0.array) assert_almost_equal(v[mis[2]].array, vec2.array)
def assert_vector_almost_equal(vec1, vec2): assert_equal(type(vec1), type(vec2)) assert_almost_equal(vec1.coeffs, vec2.coeffs)