首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何绕过“nabla_div”这个名称在ft06_elasticity.py示例中没有定义错误?

如何绕过“nabla_div”这个名称在ft06_elasticity.py示例中没有定义错误?
EN

Stack Overflow用户
提问于 2019-08-07 08:41:05
回答 2查看 924关注 0票数 1

我在Ubuntu18.04上使用Conda安装了Fenics,并在运行他们的elasticity.py示例时收到以下错误。

我试图在文档中找到解决方案或解决办法,但我甚至在任何地方都找不到nabla_div()函数描述。

芬尼茨文档指出:

nabla_grad 梯度和散度运算符现在有前缀nabla_。这在目前的问题中是没有必要的,但是对于连续介质力学中产生的向量PDE,如果你把∇解释为PDE表示法中的向量,请参阅变分公式一节中关于∇的方框。

代码语言:javascript
复制
"""
FEniCS tutorial demo program: Linear elastic problem.
  -div(sigma(u)) = f
The model is used to simulate an elastic beam clamped at
its left end and deformed under its own weight.
"""

from __future__ import print_function
from fenics import *

# Scaled variables
L = 1; W = 0.2
mu = 1
rho = 1
delta = W/L
gamma = 0.4*delta**2
beta = 1.25
lambda_ = beta
g = gamma

# Create mesh and define function space
mesh = BoxMesh(Point(0, 0, 0), Point(L, W, W), 10, 3, 3)
V = VectorFunctionSpace(mesh, 'P', 1)

# Define boundary condition
tol = 1E-14

def clamped_boundary(x, on_boundary):
    return on_boundary and x[0] < tol

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)
    #return sym(nabla_grad(u))

def sigma(u):
    return lambda_*nabla_div(u)*Identity(d) + 2*mu*epsilon(u)

# Define variational problem
u = TrialFunction(V)
d = u.geometric_dimension()  # space dimension
v = TestFunction(V)
f = Constant((0, 0, -rho*g))
T = Constant((0, 0, 0))
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)

# Plot solution
plot(u, title='Displacement', mode='displacement')

# Plot stress
s = sigma(u) - (1./3)*tr(sigma(u))*Identity(d)  # deviatoric stress
von_Mises = sqrt(3./2*inner(s, s))
V = FunctionSpace(mesh, 'P', 1)
von_Mises = project(von_Mises, V)
plot(von_Mises, title='Stress intensity')

# Compute magnitude of displacement
u_magnitude = sqrt(dot(u, u))
u_magnitude = project(u_magnitude, V)
plot(u_magnitude, 'Displacement magnitude')
print('min/max u:',
      u_magnitude.vector().array().min(),
      u_magnitude.vector().array().max())

# Save solution to file in VTK format
File('elasticity/displacement.pvd') << u
File('elasticity/von_mises.pvd') << von_Mises
File('elasticity/magnitude.pvd') << u_magnitude

# Hold plot
interactive()
代码语言:javascript
复制
Traceback (most recent call last):
  File "fenics_ft06_elasticity.py", line 48, in <module>
    a = inner(sigma(u), epsilon(v))*dx
  File "fenics_ft06_elasticity.py", line 40, in sigma
    return lambda_*nabla_div(u)*Identity(d) + 2*mu*epsilon(u)
NameError: name 'nabla_div' is not defined
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-08-07 08:50:03

我发现用'div(u)‘代替'nabla_div(u)’解决了这个错误。然而,它确实直接导致了下一个错误:

代码语言:javascript
复制
Traceback (most recent call last):
  File "fenics_ft06_elasticity.py", line 56, in <module>
    plot(u, title='Displacement', mode='displacement')
  File "/home/ron/miniconda3/envs/fenicsproject/lib/python3.7/site-packages/dolfin/common/plotting.py", line 438, in plot
    return _plot_matplotlib(object, mesh, kwargs)
  File "/home/ron/miniconda3/envs/fenicsproject/lib/python3.7/site-packages/dolfin/common/plotting.py", line 282, in _plot_matplotlib
    ax.set_aspect('equal')
  File "/home/ron/miniconda3/envs/fenicsproject/lib/python3.7/site-packages/matplotlib/axes/_base.py", line 1281, in set_aspect
    'It is not currently possible to manually set the aspect '
NotImplementedError: It is not currently possible to manually set the aspect on 3D axes
票数 0
EN

Stack Overflow用户

发布于 2020-03-05 19:50:41

只需将这两行添加到代码的开头,以使用nabla_grad和nabla_div:

代码语言:javascript
复制
from ufl import nabla_grad
from ufl import nabla_div
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57390298

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档