12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- """Apply a vector-valued point load
- to a corner of a linear-elastic cube.
- """
- # Credit https://fenicsproject.discourse.group/t/
- #applying-pointsource-at-two-different-vectors/1459/2
- from dolfin import *
- from vedo.dolfin import plot
- BULK_MOD = 1.0
- SHEAR_MOD = 1.0
- mesh = UnitCubeMesh(10, 10, 10)
- VE = VectorElement("Lagrange", mesh.ufl_cell(), 1)
- V = FunctionSpace(mesh, VE)
- # Constrain normal displacement on two sides:
- def boundary1(x, on_boundary):
- return on_boundary and near(x[1], 0.0)
- bc1 = DirichletBC(V.sub(1), Constant(0.0), boundary1)
- def boundary2(x, on_boundary):
- return on_boundary and near(x[0], 0.0)
- bc2 = DirichletBC(V.sub(0), Constant(0.0), boundary2)
- # Solve linear elasticity with point load at upper-right corner:
- u = TrialFunction(V)
- v = TestFunction(V)
- eps = 0.5 * (grad(u) + grad(u).T)
- I = Identity(3)
- sigma = BULK_MOD*tr(eps)*I + 2*SHEAR_MOD*(eps-tr(eps)*I/3)
- a = inner(sigma, grad(v)) * dx
- L = inner(Constant((0,0,0)), v) * dx
- # Assemble:
- A = assemble(a)
- B = assemble(L)
- # Apply point sources:
- ptSrcLocation = Point(1-DOLFIN_EPS, 1-DOLFIN_EPS)
- # Vectorial point load:
- f = [0.01, 0.02]
- # Distinct point sources for x- and y-components
- ptSrc_x = PointSource(V.sub(0), ptSrcLocation, f[0])
- ptSrc_y = PointSource(V.sub(1), ptSrcLocation, f[1])
- ptSrcs = [ptSrc_x, ptSrc_y]
- # Apply to RHS of linear system:
- for ptSrc in ptSrcs:
- ptSrc.apply(B)
- # Apply BCs:
- for bc in [bc1, bc2]:
- bc.apply(A)
- bc.apply(B)
- # Solve:
- u = Function(V)
- solve(A, u.vector(), B)
- plot(u, mode='displacement')
|