1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- """
- FEniCS tutorial demo program: Deflection of a membrane.
- -Laplace(w) = p in the unit circle
- w = 0 on the boundary
- The load p is a Gaussian function centered at (0, 0.6).
- """
- from fenics import *
- from mshr import Circle, generate_mesh
- # Create mesh and define function space
- domain = Circle(Point(0, 0), 1)
- mesh = generate_mesh(domain, 64)
- V = FunctionSpace(mesh, 'P', 2)
- w_D = Constant(0)
- def boundary(x, on_boundary):
- return on_boundary
- bc = DirichletBC(V, w_D, boundary)
- # Define load
- p = Expression('4*exp(-pow(beta, 2)*(pow(x[0], 2) + pow(x[1] - R0, 2)))',
- degree=1, beta=8, R0=0.6)
- # Define variational problem
- w = TrialFunction(V)
- v = TestFunction(V)
- a = dot(grad(w), grad(v))*dx
- L = p*v*dx
- # Compute solution
- w = Function(V)
- solve(a == L, w, bc)
- p = interpolate(p, V)
- # Curve plot along x = 0 comparing p and w
- import numpy as np
- tol = 0.001 # avoid hitting points outside the domain
- y = np.linspace(-1 + tol, 1 - tol, 101)
- points = [(0, y_) for y_ in y] # 2D points
- w_line = np.array([w(point) for point in points])
- p_line = np.array([p(point) for point in points])
- #######################################################################
- from vedo.dolfin import plot
- from vedo import Line, Latex
- pde = r'-T \nabla^{2} D=p, ~\Omega=\left\{(x, y) | x^{2}+y^{2} \leq R\right\}'
- tex = Latex(pde, pos=(0,1.1,.1), s=0.2, c='w')
- wline = Line(np.c_[y, w_line*10], c='white', lw=4)
- pline = Line(np.c_[y, p_line/ 4], c='lightgreen', lw=4)
- plot(w, wline, tex, bg='bb', text='Deflection')
- plot(p, pline, bg='bb', text='Load')
|