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_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('')
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)
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))))
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()
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_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('')
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))))'
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)
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()
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_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)
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_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))
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))
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))))'
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_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)