def test_terminal_expr_bilinear_2d_2(): domain = Domain('Omega', dim=2) B1 = Boundary(r'\Gamma_1', domain) x, y = domain.coordinates kappa = Constant('kappa', is_real=True) mu = Constant('mu', is_real=True) nn = NormalVector('nn') V = VectorFunctionSpace('V', domain) u, u1, u2 = [element_of(V, name=i) for i in ['u', 'u1', 'u2']] v, v1, v2 = [element_of(V, name=i) for i in ['v', 'v1', 'v2']] # ... int_0 = lambda expr: integral(domain, expr) int_1 = lambda expr: integral(B1, expr) a = BilinearForm((u, v), int_0(dot(u, v))) print(TerminalExpr(a)) print('') # ... a = BilinearForm((u, v), int_0(inner(grad(u), grad(v)))) print(TerminalExpr(a)) print('') # ... # ... a = BilinearForm((u, v), int_0(dot(u, v) + inner(grad(u), grad(v)))) print(TerminalExpr(a)) print('')
def test_latex_2d_2(): DIM = 2 domain = Domain('Omega', dim=DIM) V = VectorFunctionSpace('V', domain) x, y = V.coordinates v = element_of(V, name='v') u = element_of(V, name='u') # F = element_of(V, name='F') int_0 = lambda expr: integral(domain, expr) assert (latex(v) == r'\mathbf{v}') assert (latex(inner( grad(v), grad(u))) == r'\nabla{\mathbf{u}} : \nabla{\mathbf{v}}') a = BilinearForm((v, u), int_0(inner(grad(v), grad(u)))) print(latex(a)) # assert(latex(a) == r'\int_{0}^{1}\int_{0}^{1} \nabla{\mathbf{v}} : \nabla{\mathbf{u}} dxdy') b = LinearForm(v, int_0(sin(pi * x) * cos(pi * y) * div(v))) print(latex(b))
def test_calculus_3d_4(): domain = Domain('Omega', dim=3) W = VectorFunctionSpace('W', domain) alpha, beta, gamma = [Constant(i) for i in ['alpha', 'beta', 'gamma']] F, G, H = elements_of(W, names='F, G, H') # ... expected = alpha * inner(D(F), D(G)) + beta * inner(D(F), D(H)) assert (inner(D(F), D(alpha * G + beta * H)) == expected)
def test_bilinear_form_2d_2(): domain = Domain('Omega', dim=2) B1 = Boundary(r'\Gamma_1', domain) x, y = domain.coordinates kappa = Constant('kappa', is_real=True) mu = Constant('mu', is_real=True) V = VectorFunctionSpace('V', domain) u, u1, u2 = [element_of(V, name=i) for i in ['u', 'u1', 'u2']] v, v1, v2 = [element_of(V, name=i) for i in ['v', 'v1', 'v2']] # ... int_0 = lambda expr: integral(domain, expr) int_1 = lambda expr: integral(B1, expr) a = BilinearForm((u, v), int_0(dot(u, v))) assert (a.domain == domain.interior) assert (a(u1, v1) == int_0(dot(u1, v1))) # ... # ... a = BilinearForm((u, v), int_0(dot(u, v) + inner(grad(u), grad(v)))) assert (a.domain == domain.interior) assert (a(u1, v1) == int_0(dot(u1, v1)) + int_0(inner(grad(u1), grad(v1)))) # ... # ... a1 = BilinearForm((u1, v1), int_0(dot(u1, v1))) a = BilinearForm((u, v), a1(u, v)) assert (a.domain == domain.interior) assert (a(u2, v2) == int_0(dot(u2, v2))) # ... # ... a1 = BilinearForm((u1, v1), int_0(dot(u1, v1))) a2 = BilinearForm((u2, v2), int_0(inner(grad(u2), grad(v2)))) a = BilinearForm((u, v), a1(u, v) + kappa * a2(u, v)) assert (a.domain == domain.interior) assert (a(u, v) == int_0(dot(u, v)) + int_0(kappa * inner(grad(u), grad(v))))
def test_bilinear_form_2d_4(): domain = Domain('Omega', dim=2) B1 = Boundary(r'\Gamma_1', domain) x, y = domain.coordinates kappa = Constant('kappa', is_real=True) mu = Constant('mu', is_real=True) V = VectorFunctionSpace('V', domain) u, u1, u2 = [element_of(V, name=i) for i in ['u', 'u1', 'u2']] v, v1, v2 = [element_of(V, name=i) for i in ['v', 'v1', 'v2']] int_0 = lambda expr: integral(domain, expr) int_1 = lambda expr: integral(B1, expr) # ... a = BilinearForm((u, v), int_0(dot(u, v))) assert (a.is_symmetric) # ... # ... a = BilinearForm((u, v), int_0(inner(grad(u), grad(v)))) assert (a.is_symmetric)
def test_bilinear_expr_2d_2(): domain = Domain('Omega', dim=2) x,y = domain.coordinates kappa = Constant('kappa', is_real=True) mu = Constant('mu' , is_real=True) V = VectorFunctionSpace('V', domain) u,u1,u2 = [element_of(V, name=i) for i in ['u', 'u1', 'u2']] v,v1,v2 = [element_of(V, name=i) for i in ['v', 'v1', 'v2']] # ... a = BilinearExpr((u,v), dot(u,v)) print(a) print(a.expr) print(a(u1,v1)) # TODO # print(a(u1+u2,v1+v2)) print('') # ... # ... a1 = BilinearExpr((u,v), dot(u,v)) a2 = BilinearExpr((u,v), inner(grad(u),grad(v))) print(a1(u1,v1) + a2(u2,v2)) print('')
def test_equation_2d_4(): V = VectorFunctionSpace('V', domain) v = element_of(V, name='v') u = element_of(V, name='u') x, y = domain.coordinates B1 = Boundary(r'\Gamma_1', domain) int_0 = lambda expr: integral(domain, expr) int_1 = lambda expr: integral(B1, expr) # ... bilinear/linear forms a1 = BilinearForm((v, u), int_0(inner(grad(v), grad(u)))) f = Tuple(x * y, sin(pi * x) * sin(pi * y)) l1 = LinearForm(v, int_0(dot(f, v))) # ... # ... bc = EssentialBC(u, 0, B1) eq = Equation(a1, l1, tests=v, trials=u, bc=bc) # ... # ... bc = EssentialBC(u[0], 0, B1) eq = Equation(a1, l1, tests=v, trials=u, bc=bc) # ... # ... nn = NormalVector('nn') bc = EssentialBC(dot(u, nn), 0, B1) eq = Equation(a1, l1, tests=v, trials=u, bc=bc)
def test_compiler_3d_stokes(): domain = Domain('Omega', dim=3) # ... # by setting the space type, we cannot evaluate grad of Hdiv function, then # ArgumentTypeError will be raised. # In order to avoid this problem, we need first to declare our space as an # undefined type. Hdiv = VectorFunctionSpace('V2', domain, kind='Hdiv') L2 = ScalarFunctionSpace('V3', domain, kind='L2') X = Hdiv * L2 u, p = element_of(X, name='u, p') v, q = element_of(X, name='v, q') with pytest.raises(ArgumentTypeError): expr = inner(grad(u), grad(v)) - div(v) * p + q * div(u) # ... # ... Hdiv = VectorFunctionSpace('V2', domain) L2 = ScalarFunctionSpace('V3', domain) X = Hdiv * L2 u, p = element_of(X, name='u, p') v, q = element_of(X, name='v, q') expr = inner(grad(u), grad(v)) - div(v) * p + q * div(u) atoms = { u: DifferentialForm('u', index=2, dim=domain.dim), v: DifferentialForm('v', index=2, dim=domain.dim), p: DifferentialForm('p', index=3, dim=domain.dim), q: DifferentialForm('q', index=3, dim=domain.dim) } newexpr = ExteriorCalculusExpr(expr, tests=[v, q], atoms=atoms) print('===== BEFORE =====') print(newexpr) newexpr = augmented_expression(newexpr, tests=[v, q], atoms=atoms, weak=False) print('===== AFTER =====') print(newexpr)
def test_evaluation_2d_1(): domain = Domain('Omega', dim=2) B_neumann = Boundary(r'\Gamma_1', domain) V = FunctionSpace('V', domain) W = VectorFunctionSpace('W', domain) p, q = [TestFunction(V, name=i) for i in ['p', 'q']] u, v = [VectorTestFunction(W, name=i) for i in ['u', 'v']] alpha = Constant('alpha') x, y = V.coordinates F = Field('F', space=V) a1 = BilinearForm((p, q), dot(grad(p), grad(q))) m = BilinearForm((p, q), p * q) a2 = BilinearForm((p, q), a1(p, q) + alpha * m(p, q)) a3 = BilinearForm((u, v), rot(u) * rot(v) + alpha * div(u) * div(v)) a11 = BilinearForm((v, u), inner(grad(v), grad(u))) a12 = BilinearForm((v, p), div(v) * p) a4 = BilinearForm(((v, q), (u, p)), a11(v, u) - a12(v, p) + a12(u, q)) l0 = LinearForm(p, F * p) l_neu = LinearForm(p, p * trace_1(grad(F), B_neumann)) l = LinearForm(p, l0(p) + l_neu(p)) # ... print(a1) print(evaluate(a1)) print('') # ... # ... print(a2) print(evaluate(a2)) print('') # ... # ... print(a3) print(evaluate(a3)) print('') # ... # ... print(a4) print(evaluate(a4)) print('') # ... # ... print(l) print(evaluate(l)) print('')
def test_field_2d_1(): print('============ test_field_2d_1 =============') # x, y = domain.coordinates W = VectorFunctionSpace('W', domain) F = element_of(W, 'F') assert (dx(F) == Matrix([[dx(F[0]), dx(F[1])]])) # TODO not working yet => check it for VectorFunction also # print(dx(x*F)) expr = inner(grad(F), grad(F)) print(expr)
def test_equation_2d_5(): domain = Square() x, y = domain.coordinates f0 = Matrix([ 2 * pi**2 * sin(pi * x) * sin(pi * y), 2 * pi**2 * sin(pi * x) * sin(pi * y) ]) f1 = cos(pi * x) * cos(pi * y) W = VectorFunctionSpace('W', domain) V = ScalarFunctionSpace('V', domain) X = ProductSpace(W, V) F = element_of(W, name='F') G = element_of(V, name='G') u, v = [element_of(W, name=i) for i in ['u', 'v']] p, q = [element_of(V, name=i) for i in ['p', 'q']] int_0 = lambda expr: integral(domain, expr) a0 = BilinearForm((v, u), int_0(inner(grad(v), grad(u)))) print(' a0 done.') a1 = BilinearForm((q, p), int_0(p * q)) print(' a1 done.') a = BilinearForm(((v, q), (u, p)), a0(v, u) + a1(q, p)) print(' a done.') l0 = LinearForm(v, int_0(dot(f0, v))) l1 = LinearForm(q, int_0(f1 * q)) l = LinearForm((v, q), l0(v) + l1(q)) print('****************************') bc = EssentialBC(u, 0, domain.boundary) equation = Equation(a, l, tests=[v, q], trials=[u, p], bc=bc) # ... print('=======') print(equation.lhs.expr) print('') # ... # ... print('=======') print(equation.rhs.expr) print('')
def test_bilinear_form_2d_3(): domain = Domain('Omega', dim=2) x, y = domain.coordinates V = VectorFunctionSpace('V', domain) W = FunctionSpace('W', domain) v = VectorTestFunction(V, name='v') u = VectorTestFunction(V, name='u') p = TestFunction(W, name='p') q = TestFunction(W, name='q') a = BilinearForm((u, v), inner(grad(v), grad(u))) b = BilinearForm((v, p), div(v) * p) A = BilinearForm(((u, p), (v, q)), a(v, u) - b(v, p) + b(u, q)) export(A, 'stokes_2d.png')
def test_tensorize_2d_stokes(): domain = Domain('Omega', dim=DIM) # ... abstract model V = VectorFunctionSpace('V', domain) W = FunctionSpace('W', domain) v = VectorTestFunction(V, name='v') u = VectorTestFunction(V, name='u') p = TestFunction(W, name='p') q = TestFunction(W, name='q') a = BilinearForm((v, u), inner(grad(v), grad(u)), name='a') b = BilinearForm((v, p), div(v) * p, name='b') A = BilinearForm(((v, q), (u, p)), a(v, u) - b(v, p) + b(u, q), name='A') # ... print(A) print(tensorize(A)) print('')
def test_evaluation_2d_2(): domain = Square() x, y = domain.coordinates f0 = Tuple(2 * pi**2 * sin(pi * x) * sin(pi * y), 2 * pi**2 * sin(pi * x) * sin(pi * y)) f1 = cos(pi * x) * cos(pi * y) W = VectorFunctionSpace('W', domain) V = FunctionSpace('V', domain) X = ProductSpace(W, V) # TODO improve: naming are not given the same way F = VectorField(W, name='F') G = Field('G', V) u, v = [VectorTestFunction(W, name=i) for i in ['u', 'v']] p, q = [TestFunction(V, name=i) for i in ['p', 'q']] a0 = BilinearForm((v, u), inner(grad(v), grad(u))) a1 = BilinearForm((q, p), p * q) a = BilinearForm(((v, q), (u, p)), a0(v, u) + a1(q, p)) l0 = LinearForm(v, dot(f0, v)) l1 = LinearForm(q, f1 * q) l = LinearForm((v, q), l0(v) + l1(q)) # ... print(a) print(evaluate(a)) print('') # ... # ... print(l) print(evaluate(l)) print('')
def test_terminal_expr_bilinear_2d_4(): domain = Domain('Omega', dim=2) x, y = domain.coordinates V = VectorFunctionSpace('V', domain) W = ScalarFunctionSpace('W', domain) v = element_of(V, name='v') u = element_of(V, name='u') p = element_of(W, name='p') q = element_of(W, name='q') int_0 = lambda expr: integral(domain, expr) # stokes a = BilinearForm((u, v), int_0(inner(grad(v), grad(u)))) b = BilinearForm((v, p), int_0(div(v) * p)) a = BilinearForm(((u, p), (v, q)), a(v, u) - b(v, p) + b(u, q)) print(TerminalExpr(a)) print('')
def test_latex_2d_4(): DIM = 2 domain = Domain('Omega', dim=DIM) # ... abstract model V = VectorFunctionSpace('V', domain) W = ScalarFunctionSpace('W', domain) v = element_of(V, name='v') u = element_of(V, name='u') p = element_of(W, name='p') q = element_of(W, name='q') int_0 = lambda expr: integral(domain, expr) a = BilinearForm((v, u), int_0(inner(grad(v), grad(u)))) b = BilinearForm((v, p), int_0(div(v) * p)) A = BilinearForm(((v, q), (u, p)), a(v, u) - b(v, p) + b(u, q)) # ... print(latex(A)) # print(latex(tensorize(A))) print('')
def test_bilinearity_2d_2(): domain = Domain('Omega', dim=DIM) V1 = FunctionSpace('V1', domain) V2 = FunctionSpace('V2', domain) U1 = FunctionSpace('U1', domain) U2 = FunctionSpace('U2', domain) W1 = VectorFunctionSpace('W1', domain) W2 = VectorFunctionSpace('W2', domain) T1 = VectorFunctionSpace('T1', domain) T2 = VectorFunctionSpace('T2', domain) v1 = TestFunction(V1, name='v1') v2 = TestFunction(V2, name='v2') u1 = TestFunction(U1, name='u1') u2 = TestFunction(U2, name='u2') w1 = VectorTestFunction(W1, name='w1') w2 = VectorTestFunction(W2, name='w2') t1 = VectorTestFunction(T1, name='t1') t2 = VectorTestFunction(T2, name='t2') V = ProductSpace(V1, V2) U = ProductSpace(U1, U2) x, y = V1.coordinates alpha = Constant('alpha') F = Field('F', space=V1) # ... a1 = BilinearForm((v1, u1), u1 * v1, check=True) a = BilinearForm((v2, u2), a1(v2, u2), check=True) # ... # ... a = BilinearForm((v1, u1), dot(grad(v1), grad(u1)), check=True) # ... # ... a1 = BilinearForm((v1, u1), dot(grad(v1), grad(u1)), check=True) a = BilinearForm((v2, u2), a1(v2, u2), check=True) # ... # ... a1 = BilinearForm((v1, u1), u1 * v1) a2 = BilinearForm((v1, u1), dx(u1) * dx(v1), check=True) a = BilinearForm((v2, u2), a1(v2, u2) + a2(v2, u2), check=True) # ... # ... a1 = BilinearForm((v1, u1), u1 * v1, check=True) a2 = BilinearForm((v1, u1), dx(u1) * dx(v1), check=True) # ... # ... a1 = BilinearForm((v1, u1), u1 * v1, check=True) a2 = BilinearForm((v1, u1), dx(u1) * dx(v1), check=True) a = BilinearForm(((v1, v2), (u1, u2)), a1(v1, u2) + a2(v2, u1), check=True) # ... # ... a = BilinearForm((w1, t1), rot(w1) * rot(t1) + div(w1) * div(t1), check=True) # ... # ... a1 = BilinearForm((v1, u1), u1 * v1, check=True) a2 = BilinearForm((v1, u1), dx(u1) * dx(v1), check=True) a3 = BilinearForm((w1, t1), rot(w1) * rot(t1) + div(w1) * div(t1), check=True) a4 = BilinearForm((w1, u1), div(w1) * u1, check=True) a = BilinearForm(((w2, v2), (t2, u2)), a3(w2, t2) + a2(v2, u2) + a4(w2, u2), check=True) # ... # ... a1 = BilinearForm((v1, u1), laplace(u1) * laplace(v1), check=True) # ... # ... a1 = BilinearForm((v1, u1), inner(hessian(u1), hessian(v1)), check=True) # ... # ... stokes V = VectorFunctionSpace('V', domain) W = FunctionSpace('W', domain) v = VectorTestFunction(V, name='v') u = VectorTestFunction(V, name='u') p = TestFunction(W, name='p') q = TestFunction(W, name='q') a = BilinearForm((v, u), inner(grad(v), grad(u)), check=True) b = BilinearForm((v, p), div(v) * p, check=True) A = BilinearForm(((v, q), (u, p)), a(v, u) - b(v, p) + b(u, q), check=True) # ... ################################ # non bilinear forms ################################ # ... with pytest.raises(UnconsistentLinearExpressionError): a = BilinearForm((v1, u1), dot(grad(v1), grad(u1)) + v1, check=True) # ... # ... with pytest.raises(UnconsistentLinearExpressionError): a = BilinearForm((v1, u1), v1**2 * u1, check=True) # ... # ... with pytest.raises(UnconsistentLinearExpressionError): a = BilinearForm((v1, u1), dot(grad(v1), grad(v1)), check=True)
def test_Inner(dim): domain = Domain('Omega', dim=dim) W = VectorFunctionSpace('W', domain) a, b, c = elements_of(W, names='a, b, c') r = Constant('r') # Commutativity assert inner(a, b) == inner(b, a) # Bilinearity: vector addition assert inner(a, b + c) == inner(a, b) + inner(a, c) assert inner(a + b, c) == inner(a, c) + inner(b, c) # Bilinearity: scalar multiplication assert inner(a, r * b) == r * inner(a, b) assert inner(r * a, b) == r * inner(a, b) # Special case: null vector assert inner(a, 0) == 0 assert inner(0, a) == 0 # Special case: two arguments are the same assert inner(a, a).is_real assert inner(a, a).is_positive
def test_calls_2d(): domain = Domain('Omega', dim=DIM) V1 = FunctionSpace('V1', domain) V2 = FunctionSpace('V2', domain) U1 = FunctionSpace('U1', domain) U2 = FunctionSpace('U2', domain) W1 = VectorFunctionSpace('W1', domain) W2 = VectorFunctionSpace('W2', domain) T1 = VectorFunctionSpace('T1', domain) T2 = VectorFunctionSpace('T2', domain) v1 = TestFunction(V1, name='v1') v2 = TestFunction(V2, name='v2') u1 = TestFunction(U1, name='u1') u2 = TestFunction(U2, name='u2') w1 = VectorTestFunction(W1, name='w1') w2 = VectorTestFunction(W2, name='w2') t1 = VectorTestFunction(T1, name='t1') t2 = VectorTestFunction(T2, name='t2') V = ProductSpace(V1, V2) U = ProductSpace(U1, U2) x, y = V1.coordinates alpha = Constant('alpha') F = Field('F', space=V1) # ... a1 = BilinearForm((v1, u1), u1 * v1, name='a1') print(a1) print(atomize(a1)) print(evaluate(a1)) print('') expr = a1(v2, u2) a = BilinearForm((v2, u2), expr, name='a') print(a) print(atomize(a)) print(evaluate(a)) print('') # ... # ... a = BilinearForm((v1, u1), dot(grad(v1), grad(u1)), name='a') print(a) print(atomize(a)) print(evaluate(a)) print('') # ... # ... a1 = BilinearForm((v1, u1), dot(grad(v1), grad(u1)), name='a1') expr = a1(v2, u2) a = BilinearForm((v2, u2), expr, name='a') print(a) print(atomize(a)) print(evaluate(a)) print('') # ... # ... a1 = BilinearForm((v1, u1), u1 * v1, name='a1') a2 = BilinearForm((v1, u1), dx(u1) * dx(v1), name='a2') expr = a1(v2, u2) + a2(v2, u2) a = BilinearForm((v2, u2), expr, name='a') print(a) print(atomize(a)) print(evaluate(a)) print('') # ... # ... a1 = BilinearForm((v1, u1), u1 * v1, name='a1') a2 = BilinearForm((v1, u1), dx(u1) * dx(v1), name='a2') expr = a1(v1, u2) print('> before = ', expr) expr = expr.subs(u2, u1) print('> after = ', expr) print('') expr = a1(v1, u2) + a1(v2, u2) print('> before = ', expr) expr = expr.subs(u2, u1) print('> after = ', expr) print('') # ... # ... a1 = BilinearForm((v1, u1), u1 * v1, name='a1') a2 = BilinearForm((v1, u1), dx(u1) * dx(v1), name='a2') expr = a1(v1, u2) + a2(v2, u1) a = BilinearForm(((v1, v2), (u1, u2)), expr, name='a') print(a) print(atomize(a)) print(evaluate(a)) print('') # ... # ... a = BilinearForm((w1, t1), rot(w1) * rot(t1) + div(w1) * div(t1), name='a') print(a) print(atomize(a)) print(evaluate(a)) # ... # ... a1 = BilinearForm((v1, u1), u1 * v1, name='a1') a2 = BilinearForm((v1, u1), dx(u1) * dx(v1), name='a2') a3 = BilinearForm((w1, t1), rot(w1) * rot(t1) + div(w1) * div(t1), name='a3') a4 = BilinearForm((w1, u1), div(w1) * u1, name='a4') expr = a3(w2, t2) + a2(v2, u2) + a4(w2, u2) a = BilinearForm(((w2, v2), (t2, u2)), expr, name='a') print(a) print(atomize(a)) print(evaluate(a)) # ... # ... a1 = BilinearForm((v1, u1), laplace(u1) * laplace(v1), name='a1') print(a1) print(atomize(a1)) print(evaluate(a1)) print('') # ... # ... a1 = BilinearForm((v1, u1), inner(hessian(u1), hessian(v1)), name='a1') print('================================') print(a1) print(atomize(a1)) print(evaluate(a1)) print('') # ... # ... l1 = LinearForm(v1, x * y * v1, name='11') expr = l1(v2) l = LinearForm(v2, expr, name='1') print(l) print(atomize(l)) print(evaluate(l)) # ... # ... l1 = LinearForm(v1, x * y * v1, name='l1') l2 = LinearForm(v2, cos(x + y) * v2, name='l2') expr = l1(u1) + l2(u2) l = LinearForm((u1, u2), expr, name='1') print(l) print(atomize(l)) print(evaluate(l)) # ... # ... l1 = LinearForm(v1, x * y * v1, name='l1') l2 = LinearForm(v2, cos(x + y) * v2, name='l2') expr = l1(u1) + alpha * l2(u2) l = LinearForm((u1, u2), expr, name='1') print(l) print(atomize(l)) print(evaluate(l)) # ... # ... l1 = LinearForm(v1, x * y * v1, name='l1') l2 = LinearForm(w1, div(w1), name='l2') expr = l1(v2) + l2(w2) l = LinearForm((v2, w2), expr, name='1') print(l) print(atomize(l)) print(evaluate(l)) # ... # ... I1 = Integral(x * y, domain, name='I1') print(I1) print(atomize(I1)) print(evaluate(I1)) # ... # ... expr = F - cos(2 * pi * x) * cos(3 * pi * y) expr = dot(grad(expr), grad(expr)) I2 = Integral(expr, domain, name='I2') print(I2) print(atomize(I2)) print(evaluate(I2)) # ... # ... expr = F - cos(2 * pi * x) * cos(3 * pi * y) expr = dot(grad(expr), grad(expr)) I2 = Integral(expr, domain, name='I2') print(I2) print(atomize(I2)) print(evaluate(I2)) # ... # ... stokes V = VectorFunctionSpace('V', domain) W = FunctionSpace('W', domain) v = VectorTestFunction(V, name='v') u = VectorTestFunction(V, name='u') p = TestFunction(W, name='p') q = TestFunction(W, name='q') a = BilinearForm((v, u), inner(grad(v), grad(u)), name='a') b = BilinearForm((v, p), div(v) * p, name='b') A = BilinearForm(((v, q), (u, p)), a(v, u) - b(v, p) + b(u, q), name='A') print(A) print(atomize(A)) print(evaluate(A))