Ejemplo n.º 1
0
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)
Ejemplo n.º 2
0
def test_latex_2d_3():
    DIM = 2

    domain = Domain('Omega', dim=DIM)

    B1 = Boundary(r'\Gamma_1', domain)
    B2 = Boundary(r'\Gamma_2', domain)
    B3 = Boundary(r'\Gamma_3', domain)

    V = ScalarFunctionSpace('V', domain)

    x = V.coordinates

    v = element_of(V, name='v')
    u = element_of(V, name='u')

    int_0 = lambda expr: integral(domain, expr)
    int_1 = lambda expr: integral(B1, expr)

    # ...
    expr = dot(grad(v), grad(u))
    a_0 = BilinearForm((v, u), int_0(expr))

    expr = v * u
    a_bnd = BilinearForm((v, u), int_1(expr))

    expr = a_0(v, u) + a_bnd(v, u)
    a = BilinearForm((v, u), expr)
    print(latex(a_0))
    print(latex(a_bnd))
    print(latex(a))
    #    print(a)
    print('')
Ejemplo n.º 3
0
def test_equation_2d_3():

    V = ScalarFunctionSpace('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(dot(grad(v), grad(u))))
    a2 = BilinearForm((v, u), int_0(v * u))

    l1 = LinearForm(v, int_0(x * y * v))
    l2 = LinearForm(v, int_0(cos(x + y) * v))
    # ...

    # ...
    bc = EssentialBC(u, 0, B1)
    eq = Equation(a1, l1, tests=v, trials=u, bc=bc)
    # ...

    # ...
    nn = NormalVector('nn')
    bc = EssentialBC(dot(grad(u), nn), 0, B1)
    eq = Equation(a1, l1, tests=v, trials=u, bc=bc)
Ejemplo n.º 4
0
def test_logical_expr_3d_5():

    dim = 3
    domain = Domain('Omega', dim=dim)
    M = Mapping('M', dim=dim)

    mapped_domain = M(domain)

    V = VectorFunctionSpace('V', domain, kind='hcurl')
    VM = VectorFunctionSpace('VM', mapped_domain, kind='hcurl')

    J = M.jacobian
    u, v = elements_of(V, names='u,v')
    um, vm = elements_of(VM, names='u,v')

    int_md = lambda expr: integral(mapped_domain, expr)
    int_ld = lambda expr: integral(domain, expr)

    am = BilinearForm((um, vm), int_md(dot(curl(vm), curl(um))))
    a = LogicalExpr(am)

    assert a == BilinearForm(
        (u, v),
        int_ld(
            sqrt((J.T * J).det()) *
            dot(J / J.det() * curl(u), J / J.det() * curl(v))))
Ejemplo n.º 5
0
def test_assembly_linear_form_2d_1():
    b = LinearForm(v, integral(domain, v*cos(x)))
    ast = AST(b)

    stmt = parse(ast.expr, settings={'dim': ast.dim, 'nderiv': ast.nderiv})
    print(pycode(stmt))
    print()
Ejemplo n.º 6
0
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))
Ejemplo n.º 7
0
def test_latex_2d_5():
    DIM = 2

    domain = Domain('Omega', dim=DIM)

    # ... abstract model
    W1 = VectorFunctionSpace('W1', domain)

    w1 = element_of(W1, name='w1')
    F = element_of(W1, 'F')

    int_0 = lambda expr: integral(domain, expr)

    # ...
    l1 = LinearForm(w1, int_0(dot(w1, F)))

    print(latex(l1))
    print('')
    # ...

    # ...
    l2 = LinearForm(w1, int_0(rot(w1) * rot(F) + div(w1) * div(F)))

    print(latex(l2))
    print('')
Ejemplo n.º 8
0
def test_logical_expr_2d_3():
    dim = 2

    A = Square('A')
    B = Square('B')

    M1 = Mapping('M1', dim=dim)
    M2 = Mapping('M2', dim=dim)

    D1 = M1(A)
    D2 = M2(B)

    domain = D1.join(D2,
                     name='domain',
                     bnd_minus=D1.get_boundary(axis=0, ext=1),
                     bnd_plus=D2.get_boundary(axis=0, ext=-1))

    V = VectorFunctionSpace('V', domain, kind='hcurl')

    u, v = [element_of(V, name=i) for i in ['u', 'v']]

    int_0 = lambda expr: integral(domain, expr)

    expr = LogicalExpr(int_0(dot(u, v)), domain)
    assert str(
        expr.args[0]
    ) == 'Integral(A, Dot((Jacobian(M1)**(-1)).T * u, (Jacobian(M1)**(-1)).T * v)*sqrt(det(Jacobian(M1).T * Jacobian(M1))))'
    assert str(
        expr.args[1]
    ) == 'Integral(B, Dot((Jacobian(M2)**(-1)).T * u, (Jacobian(M2)**(-1)).T * v)*sqrt(det(Jacobian(M2).T * Jacobian(M2))))'
Ejemplo n.º 9
0
def test_newton_2d_1():

    # ... abstract model
    B1 = Boundary(r'\Gamma_1', domain)

    V = ScalarFunctionSpace('V', domain)

    x, y = domain.coordinates

    Un = element_of(V, name='Un')
    v = element_of(V, name='v')

    int_0 = lambda expr: integral(domain, expr)

    f = -4. * exp(-Un)
    l = LinearForm(v, int_0(dot(grad(v), grad(Un)) - f * v))

    u = element_of(V, name='u')
    eq = NewtonIteration(l, Un, trials=u)
    # ...

    # ...
    expected = int_0(-4.0 * u * v * exp(-Un) + dot(grad(u), grad(v)))

    assert (eq.lhs.expr == expected)
    # ...

    # ...
    bc = EssentialBC(u, 0, B1)
    eq = NewtonIteration(l, Un, bc=bc, trials=u)
Ejemplo n.º 10
0
def test_assembly_bilinear_form_2d_1():
    a = BilinearForm((u,v), integral(domain, dot(grad(u), grad(v))))
    ast = AST(a)

    stmt = parse(ast.expr, settings={'dim': ast.dim, 'nderiv': ast.nderiv})
    print(pycode(stmt))
    print()
Ejemplo n.º 11
0
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('')
Ejemplo n.º 12
0
def test_equation_2d_2():

    domain = Square()

    V = ScalarFunctionSpace('V', domain)

    x, y = domain.coordinates

    pn, wn = [element_of(V, name=i) for i in ['pn', 'wn']]

    dp = element_of(V, name='dp')
    dw = element_of(V, name='dw')
    tau = element_of(V, name='tau')
    sigma = element_of(V, name='sigma')

    Re = Constant('Re', real=True)
    dt = Constant('dt', real=True)
    alpha = Constant('alpha', real=True)

    int_0 = lambda expr: integral(domain, expr)

    s = BilinearForm((tau, sigma), int_0(dot(grad(tau), grad(sigma))))
    m = BilinearForm((tau, sigma), int_0(tau * sigma))
    b1 = BilinearForm((tau, dw), int_0(bracket(pn, dw) * tau))
    b2 = BilinearForm((tau, dp), int_0(bracket(dp, wn) * tau))

    l1 = LinearForm(
        tau, int_0(bracket(pn, wn) * tau - 1. / Re * dot(grad(tau), grad(wn))))

    expr = m(tau, dw) - alpha * dt * b1(tau, dw) - dt * b2(
        tau, dp) - (alpha * dt / Re) * s(tau, dw)
    a = BilinearForm(((tau, sigma), (dp, dw)), int_0(expr))

    l = LinearForm((tau, sigma), dt * l1(tau))

    bc = [EssentialBC(dp, 0, domain.boundary)]
    bc += [EssentialBC(dw, 0, domain.boundary)]
    equation = Equation(a, l, tests=[tau, sigma], trials=[dp, dw], bc=bc)
Ejemplo n.º 13
0
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('')
Ejemplo n.º 14
0
def test_latex_2d_1():

    DIM = 2
    domain = Domain('Omega', dim=DIM)

    V = ScalarFunctionSpace('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(grad(v)) == r'\nabla{v}')
    assert (latex(dot(grad(v), grad(u))) == r'\nabla{u} \cdot \nabla{v}')

    a = BilinearForm((v, u), int_0(dot(grad(v), grad(u))))
    print(latex(a))
    #    assert(latex(a) == r'\int_{0}^{1}\int_{0}^{1} \nabla{v} \cdot \nabla{u} dxdy')

    b = LinearForm(v, int_0(sin(pi * x) * cos(pi * y) * v))
    print(latex(b))
Ejemplo n.º 15
0
def test_find_2d_1():

    V = ScalarFunctionSpace('V', domain)
    U = ScalarFunctionSpace('U', domain)

    v = element_of(V, name='v')
    u = element_of(U, name='u')

    x,y = domain.coordinates

    alpha = Constant('alpha')
    kappa = Constant('kappa', real=True)
    eps   = Constant('eps', real=True)

    B1 = Boundary(r'\Gamma_1', domain)
    B2 = Boundary(r'\Gamma_2', domain)
    B3 = Boundary(r'\Gamma_3', domain)
    
    int_0 = lambda expr: integral(domain , expr)
    int_1 = lambda expr: integral(B1, expr)
    int_2 = lambda expr: integral(B2, expr)
    # ... bilinear/linear forms
    expr = dot(grad(v), grad(u))
    a1 = BilinearForm((v,u), int_0(expr))

    expr = v*u
    a2 = BilinearForm((v,u), int_0(expr))

    expr = v*u
    a_B1 = BilinearForm((v, u), int_1(expr))

    expr = x*y*v
    l1 = LinearForm(v, int_0(expr))

    expr = cos(x+y)*v
    l2 = LinearForm(v, int_0(expr))

    expr = x*y*v
    l_B2 = LinearForm(v, int_1(expr))
    # ...

    # ...
    equation = find(u, forall=v, lhs=a1(u,v), rhs=l1(v))
    # ...

    # ...
    a = BilinearForm((v,u), a1(v,u) + alpha*a2(v,u))
    equation = find(u, forall=v, lhs=a(u,v), rhs=l1(v))
    # ...

    # ...
    a = BilinearForm((v,u), a1(v,u) + a_B1(v,u))
    equation = find(u, forall=v, lhs=a(u,v), rhs=l1(v))
    # ...

    # ...
    a = BilinearForm((v,u), a1(v,u) + a_B1(v,u))
    l = LinearForm(v, l1(v) + l2(v))
    equation = find(u, forall=v, lhs=a(u,v), rhs=l(v))
    # ...

    # ...
    a = BilinearForm((v,u), a1(v,u) + a_B1(v,u))
    l = LinearForm(v, l1(v) + alpha*l_B2(v))
    equation = find(u, forall=v, lhs=a(u,v), rhs=l(v))
    # ...

    # ... using bc
    equation = find(u, forall=v, lhs=a(u,v), rhs=l(v), bc=EssentialBC(u, 0, B1))
Ejemplo n.º 16
0
def test_logical_expr_2d_2():
    dim = 2

    A = Square('A')
    B = Square('B')

    M1 = Mapping('M1', dim=dim)
    M2 = Mapping('M2', dim=dim)

    D1 = M1(A)
    D2 = M2(B)

    domain = D1.join(D2,
                     name='domain',
                     bnd_minus=D1.get_boundary(axis=0, ext=1),
                     bnd_plus=D2.get_boundary(axis=0, ext=-1))

    V1 = ScalarFunctionSpace('V1', domain, kind='h1')
    V2 = VectorFunctionSpace('V2', domain, kind='h1')

    u1, v1 = [element_of(V1, name=i) for i in ['u1', 'v1']]
    u2, v2 = [element_of(V2, name=i) for i in ['u2', 'v2']]

    int_0 = lambda expr: integral(domain, expr)
    int_1 = lambda expr: integral(domain.interfaces, expr)

    expr = LogicalExpr(int_0(u1 * v1), domain)
    assert str(
        expr.args[0]
    ) == 'Integral(A, u1*v1*sqrt(det(Jacobian(M1).T * Jacobian(M1))))'
    assert str(
        expr.args[1]
    ) == 'Integral(B, u1*v1*sqrt(det(Jacobian(M2).T * Jacobian(M2))))'

    expr = LogicalExpr(int_1(plus(u1) * plus(v1)), domain)
    assert str(
        expr
    ) == 'Integral(A|B, PlusInterfaceOperator(u1)*PlusInterfaceOperator(v1)*sqrt(det(Jacobian(M1|M2).T * Jacobian(M1|M2))))'

    expr = LogicalExpr(int_1(minus(u1) * minus(v1)), domain)
    assert str(
        expr
    ) == 'Integral(A|B, MinusInterfaceOperator(u1)*MinusInterfaceOperator(v1)*sqrt(det(Jacobian(M1|M2).T * Jacobian(M1|M2))))'

    expr = LogicalExpr(int_0(dot(u2, v2)), domain)
    assert str(
        expr.args[0]
    ) == 'Integral(A, Dot(u2, v2)*sqrt(det(Jacobian(M1).T * Jacobian(M1))))'
    assert str(
        expr.args[1]
    ) == 'Integral(B, Dot(u2, v2)*sqrt(det(Jacobian(M2).T * Jacobian(M2))))'

    expr = LogicalExpr(int_1(dot(plus(u2), plus(v2))), domain)
    assert str(
        expr
    ) == 'Integral(A|B, Dot(PlusInterfaceOperator(u2), PlusInterfaceOperator(v2))*sqrt(det(Jacobian(M1|M2).T * Jacobian(M1|M2))))'

    expr = LogicalExpr(int_1(dot(minus(u2), minus(v2))), domain)
    assert str(
        expr
    ) == 'Integral(A|B, Dot(MinusInterfaceOperator(u2), MinusInterfaceOperator(v2))*sqrt(det(Jacobian(M1|M2).T * Jacobian(M1|M2))))'

    expr = LogicalExpr(int_1(dot(grad(minus(u2)), grad(minus(v2)))), domain)
    assert str(
        expr
    ) == 'Integral(A|B, Dot((Jacobian(M1)**(-1)).T * Grad(MinusInterfaceOperator(u2)), (Jacobian(M1)**(-1)).T * Grad(MinusInterfaceOperator(v2)))*sqrt(det(Jacobian(M1|M2).T * Jacobian(M1|M2))))'

    expr = LogicalExpr(int_1(dot(grad(plus(u2)), grad(plus(v2)))), domain)
    assert str(
        expr
    ) == 'Integral(A|B, Dot((Jacobian(M2)**(-1)).T * Grad(PlusInterfaceOperator(u2)), (Jacobian(M2)**(-1)).T * Grad(PlusInterfaceOperator(v2)))*sqrt(det(Jacobian(M1|M2).T * Jacobian(M1|M2))))'
Ejemplo n.º 17
0
def test_equation_2d_6():

    domain = Square()
    x, y = domain.coordinates

    kappa = Constant('kappa', is_real=True)
    mu = Constant('mu', is_real=True)

    b1 = 1.
    b2 = 0.
    b = Tuple(b1, b2)

    # right hand side
    f = x * y

    e = ElementDomain()
    area = Area(e)

    V = ScalarFunctionSpace('V', domain)

    u, v = [element_of(V, name=i) for i in ['u', 'v']]

    int_0 = lambda expr: integral(domain, expr)

    # ...
    expr = kappa * dot(grad(u), grad(v)) + dot(b, grad(u)) * v
    a = BilinearForm((v, u), int_0(expr))
    # ...
    # ...
    expr = f * v
    l0 = LinearForm(v, int_0(expr))
    # ...

    # ...
    expr = (-kappa * laplace(u) + dot(b, grad(u))) * dot(b, grad(v))
    s1 = BilinearForm((v, u), int_0(expr))

    expr = -f * dot(b, grad(v))
    l1 = LinearForm(v, int_0(expr))
    # ...

    # ...
    expr = (-kappa * laplace(u) + dot(b, grad(u))) * (dot(b, grad(v)) -
                                                      kappa * laplace(v))
    s2 = BilinearForm((v, u), int_0(expr))

    expr = -f * (dot(b, grad(v)) - kappa * laplace(v))
    l2 = LinearForm(v, int_0(expr))
    # ...

    # ...
    expr = (-kappa * laplace(u) + dot(b, grad(u))) * (dot(b, grad(v)) +
                                                      kappa * laplace(v))
    s3 = BilinearForm((v, u), int_0(expr))

    expr = -f * (dot(b, grad(v)) + kappa * laplace(v))
    l3 = LinearForm(v, int_0(expr))
    # ...

    # ...
    expr = a(v, u) + mu * area * s1(v, u)
    a1 = BilinearForm((v, u), expr)
    # ...

    # ...
    expr = a(v, u) + mu * area * s2(v, u)
    a2 = BilinearForm((v, u), expr)
    # ...

    # ...
    expr = a(v, u) + mu * area * s3(v, u)
    a3 = BilinearForm((v, u), expr)
    # ...

    bc = EssentialBC(u, 0, domain.boundary)

    # ...
    l = LinearForm(v, l0(v) + mu * area * l1(v))

    eq_1 = Equation(a1, l, tests=v, trials=u, bc=bc)
    # ...

    # ...
    l = LinearForm(v, l0(v) + mu * area * l2(v))

    eq_2 = Equation(a2, l, tests=v, trials=u, bc=bc)
    # ...

    # ...
    l = LinearForm(v, l0(v) + mu * area * l3(v))

    eq_3 = Equation(a3, l, tests=v, trials=u, bc=bc)
Ejemplo n.º 18
0
def test_equation_2d_1():

    V = ScalarFunctionSpace('V', domain)
    U = ScalarFunctionSpace('U', domain)

    v = element_of(V, name='v')
    u = element_of(U, name='u')

    x, y = domain.coordinates

    alpha = Constant('alpha')
    kappa = Constant('kappa', real=True)
    eps = Constant('eps', real=True)
    nn = NormalVector('nn')

    B1 = Boundary(r'\Gamma_1', domain)
    B2 = Boundary(r'\Gamma_2', domain)
    B3 = Boundary(r'\Gamma_3', domain)

    int_0 = lambda expr: integral(domain, expr)
    int_1 = lambda expr: integral(B1, expr)
    int_2 = lambda expr: integral(B2, expr)

    # ... bilinear/linear forms
    expr = dot(grad(v), grad(u))
    a1 = BilinearForm((v, u), int_0(expr))

    expr = v * u
    a2 = BilinearForm((v, u), int_0(expr))

    expr = v * u
    a_B1 = BilinearForm((v, u), int_1(expr))

    expr = x * y * v
    l1 = LinearForm(v, int_0(expr))

    expr = cos(x + y) * v
    l2 = LinearForm(v, int_0(expr))

    expr = x * y * v
    l_B2 = LinearForm(v, int_2(expr))
    # ...

    #    # ...
    #    with pytest.raises(UnconsistentLhsError):
    #        equation = Equation(a1, l1(v))
    #
    #    with pytest.raises(UnconsistentLhsError):
    #        equation = Equation(l1(v), l1(v))
    #
    #    with pytest.raises(UnconsistentLhsError):
    #        equation = Equation(a1(v,u) + alpha*a2(v,u), l1(v))
    #    # ...
    #
    #    # ...
    #    with pytest.raises(UnconsistentRhsError):
    #        equation = Equation(a1(v,u), l1)
    #
    #    with pytest.raises(UnconsistentRhsError):
    #        equation = Equation(a1(v,u), a1(v,u))
    #
    #    with pytest.raises(UnconsistentRhsError):
    #        equation = Equation(a1(v,u), l1(v) + l2(v))
    #    # ...

    # ...
    equation = Equation(a1, l1, tests=v, trials=u)
    # ...

    # ...
    a = BilinearForm((v, u), a1(v, u) + alpha * a2(v, u))
    equation = Equation(a, l1, tests=v, trials=u)
    # ...

    # ...
    a = BilinearForm((v, u), a1(v, u) + a_B1(v, u))
    equation = Equation(a, l1, tests=v, trials=u)
    # ...

    # ...
    a = BilinearForm((v, u), a1(v, u) + a_B1(v, u))
    l = LinearForm(v, l1(v) + l2(v))
    equation = Equation(a, l, tests=v, trials=u)
    # ...

    # ...
    a = BilinearForm((v, u), a1(v, u) + a_B1(v, u))
    l = LinearForm(v, l1(v) + alpha * l_B2(v))
    equation = Equation(a, l, tests=v, trials=u)
    # ...

    # ... using bc
    equation = Equation(a1, l1, tests=v, trials=u, bc=EssentialBC(u, 0, B1))
    # ...

    # ... Poisson with Nitsch method
    g = cos(pi * x) * cos(pi * y)
    a0 = BilinearForm((u, v), int_0(dot(grad(u), grad(v))))
    a_B1 = BilinearForm((u, v), -int_1(kappa * u * dot(grad(v), nn) -
                                       v * dot(grad(u), nn) + u * v / eps))

    a = BilinearForm((u, v), a0(u, v) + a_B1(u, v))
    l = LinearForm(v, int_0(g * v / eps) - int_1(kappa * v * g))
    equation = Equation(a, l, tests=v, trials=u)