def test_calculus_2d_1(): domain = Domain('Omega', dim=2) V = ScalarFunctionSpace('V', domain) W = VectorFunctionSpace('W', domain) alpha, beta, gamma = [Constant(i) for i in ['alpha', 'beta', 'gamma']] f, g, h = elements_of(V, names='f, g, h') F, G, H = elements_of(W, names='F, G, H') # ... scalar gradient properties assert (grad(f + g) == grad(f) + grad(g)) assert (grad(alpha * h) == alpha * grad(h)) assert (grad(alpha * f + beta * g) == alpha * grad(f) + beta * grad(g)) assert (grad(f * g) == f * grad(g) + g * grad(f)) assert (grad(f / g) == -f * grad(g) / g**2 + grad(f) / g) assert (expand(grad(f * g * h)) == f * g * grad(h) + f * h * grad(g) + g * h * grad(f)) # ... # ... vector gradient properties assert (grad(F + G) == grad(F) + grad(G)) assert (grad(alpha * H) == alpha * grad(H)) assert (grad(alpha * F + beta * G) == alpha * grad(F) + beta * grad(G)) assert (grad(dot(F, G)) == convect(F, G) + convect(G, F) + cross(F, curl(G)) - cross(curl(F), G)) # ... # ... curl properties assert (curl(f + g) == curl(f) + curl(g)) assert (curl(alpha * h) == alpha * curl(h)) assert (curl(alpha * f + beta * g) == alpha * curl(f) + beta * curl(g)) # ... # ... laplace properties assert (laplace(f + g) == laplace(f) + laplace(g)) assert (laplace(alpha * h) == alpha * laplace(h)) assert (laplace(alpha * f + beta * g) == alpha * laplace(f) + beta * laplace(g)) # ... # ... divergence properties assert (div(F + G) == div(F) + div(G)) assert (div(alpha * H) == alpha * div(H)) assert (div(alpha * F + beta * G) == alpha * div(F) + beta * div(G)) assert (div(cross(F, G)) == -dot(F, curl(G)) + dot(G, curl(F))) # ... # ... rot properties assert (rot(F + G) == rot(F) + rot(G)) assert (rot(alpha * H) == alpha * rot(H)) assert (rot(alpha * F + beta * G) == alpha * rot(F) + beta * rot(G))
def test_bilinearity_2d_1(): domain = Square() x, y = domain.coordinates alpha = Constant('alpha') beta = Constant('beta') f1 = x * y f2 = x + y f = Tuple(f1, f2) V = FunctionSpace('V', domain) # TODO improve: naming are not given the same way G = Field('G', V) p, q = [TestFunction(V, name=i) for i in ['p', 'q']] ##################################### # linear expressions ##################################### # ... expr = p * q assert (is_bilinear_form(expr, (p, q))) # ... # ... expr = dot(grad(p), grad(q)) assert (is_bilinear_form(expr, (p, q))) # ... # ... expr = alpha * dot(grad(p), grad(q)) + beta * p * q + laplace(p) * laplace(q) assert (is_bilinear_form(expr, (p, q))) # ... ##################################### ##################################### # nonlinear expressions ##################################### # ... with pytest.raises(UnconsistentLinearExpressionError): expr = alpha * dot(grad(p**2), grad(q)) + beta * p * q is_bilinear_form(expr, (p, q))
def test_zero_derivative(): assert grad(1) == 0 # native int assert grad(2.3) == 0 # native float assert grad(4 + 5j) == 0 # native complex assert grad(Integer(1)) == 0 # sympy Integer assert grad(Float(2.3)) == 0 # sympy Float assert grad(Rational(6, 7)) == 0 # sympy Rational assert grad(Constant('a')) == 0 # sympde Constant assert laplace(1) == 0 # native int assert laplace(2.3) == 0 # native float assert laplace(4 + 5j) == 0 # native complex assert laplace(Integer(1)) == 0 # sympy Integer assert laplace(Float(2.3)) == 0 # sympy Float assert laplace(Rational(6, 7)) == 0 # sympy Rational assert laplace(Constant('a')) == 0 # sympde Constant assert hessian(1) == 0 # native int assert hessian(2.3) == 0 # native float assert hessian(4 + 5j) == 0 # native complex assert hessian(Integer(1)) == 0 # sympy Integer assert hessian(Float(2.3)) == 0 # sympy Float assert hessian(Rational(6, 7)) == 0 # sympy Rational assert hessian(Constant('a')) == 0 # sympde Constant # 2D convection of constant scalar field domain = Domain('Omega', dim=2) W = VectorFunctionSpace('W', domain) F = element_of(W, name='F') assert convect(F, 1) == 0 # native int assert convect(F, 2.3) == 0 # native float assert convect(F, 4 + 5j) == 0 # native complex assert convect(F, Integer(1)) == 0 # sympy Integer assert convect(F, Float(2.3)) == 0 # sympy Float assert convect(F, Rational(6, 7)) == 0 # sympy Rational assert convect(F, Constant('a')) == 0 # sympde Constant # 3D convection of constant scalar field domain = Domain('Omega', dim=3) Z = VectorFunctionSpace('Z', domain) G = element_of(Z, name='G') assert convect(G, 1) == 0 # native int assert convect(G, 2.3) == 0 # native float assert convect(G, 4 + 5j) == 0 # native complex assert convect(G, Integer(1)) == 0 # sympy Integer assert convect(G, Float(2.3)) == 0 # sympy Float assert convect(G, Rational(6, 7)) == 0 # sympy Rational assert convect(G, Constant('a')) == 0 # sympde Constant
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)
def test_stabilization_2d_1(): domain = Domain('Omega', dim=2) x, y = domain.coordinates kappa = Constant('kappa', is_real=True) mu = Constant('mu', is_real=True) b1 = 1. b2 = 0. b = Matrix((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 l = 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) # ... print(a1) print(TerminalExpr(a1)) print('') print(a2) print(TerminalExpr(a2)) print('') print(a3) print(TerminalExpr(a3)) print('')
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))
def test_stabilization_2d_1(): domain = Domain('Omega', dim=2) 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 = FunctionSpace('V', domain) u, v = [TestFunction(V, name=i) for i in ['u', 'v']] # ... expr = kappa * dot(grad(u), grad(v)) + dot(b, grad(u)) * v a = BilinearForm((v, u), expr) # ... # ... expr = f * v l = LinearForm(v, expr) # ... # ... expr = (-kappa * laplace(u) + dot(b, grad(u))) * dot(b, grad(v)) s1 = BilinearForm((v, u), expr) expr = -f * dot(b, grad(v)) l1 = LinearForm(v, expr) # ... # ... expr = (-kappa * laplace(u) + dot(b, grad(u))) * (dot(b, grad(v)) - kappa * laplace(v)) s2 = BilinearForm((v, u), expr) expr = -f * (dot(b, grad(v)) - kappa * laplace(v)) l2 = LinearForm(v, expr) # ... # ... expr = (-kappa * laplace(u) + dot(b, grad(u))) * (dot(b, grad(v)) + kappa * laplace(v)) s3 = BilinearForm((v, u), expr) expr = -f * (dot(b, grad(v)) + kappa * laplace(v)) l3 = LinearForm(v, 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) # ... print(a1) print(evaluate(a1, verbose=True)) print('') print(a2) print(evaluate(a2, verbose=True)) print('') print(a3) print(evaluate(a3, verbose=True)) 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)