1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- """A beam deforming under its own weight."""
- from dolfin import *
- # Scaled variables
- l, w = 1, 0.1
- mu_, lambda_ = 1, 1
- rho = 10
- gamma = (w/l)**2
- wind = (0, 0.0, 0)
- # Create mesh and define function space
- mesh = BoxMesh(Point(0, 0, 0), Point(l, w, w), 50, 5, 5)
- V = VectorFunctionSpace(mesh, "P", 1)
- # Define boundary condition
- def clamped_boundary(x, on_boundary):
- return on_boundary and (near(x[0], 0) or near(x[0], l))
- bc = DirichletBC(V, Constant((0, 0, 0)), clamped_boundary)
- # Define strain and stress
- def epsilon(u):
- return 0.5 * (nabla_grad(u) + nabla_grad(u).T)
- def sigma(u):
- return lambda_ * nabla_grad(u) * Identity(3) + 2 * mu_ * epsilon(u)
- # Define variational problem
- u = TrialFunction(V)
- v = TestFunction(V)
- f = Constant((0, 0, -rho * gamma))
- T = Constant(wind)
- a = inner(sigma(u), epsilon(v)) * dx
- L = dot(f, v) * dx + dot(T, v) * ds
- # Compute solution
- u = Function(V)
- solve(a == L, u, bc)
- s = sigma(u) - (1.0 / 3) * tr(sigma(u)) * Identity(3) # deviatoric stress
- von_Mises = sqrt(3.0 / 2 * inner(s, s))
- V = FunctionSpace(mesh, "P", 1)
- von_Mises = project(von_Mises, V)
- u_magnitude = sqrt(dot(u, u))
- u_magnitude = project(u_magnitude, V)
- ################################ Plot solution
- from vedo import Text3D
- from vedo.dolfin import plot
- plot(
- u, mode="displaced mesh",
- text=__doc__,
- scalarbar=False,
- axes=1,
- viewup='z',
- )
- #export_window('elasticbeam1.x3d') # generate a html test page
- txt = Text3D("Von Mises stress intensity", pos=(0.1,.12,0), s=0.03, c='white')
- plot(von_Mises, txt, cmap='plasma', scalarbar=False, new=True)
- #export_window('elasticbeam2.x3d') # generate a html test page
- txt = Text3D("Magnitude of displacement", pos=(0.1,.12,0), s=0.03, c='white')
- plot(u_magnitude, txt, scalarbar=False, new=True)
- #export_window('elasticbeam3.x3d') # generate a html test page
|