from dolfin import *
Define geometry
mesh = RectangleMesh(Point(0, 0), Point(1, 0.2), 50, 10)
Define function spaces
P2 = FiniteElement(“Lagrange”, mesh.ufl_cell(), 2)
P1 = FiniteElement(“Lagrange”, mesh.ufl_cell(), 1, variant=“equispaced”)
TH = P2 * P1
X = FunctionSpace(mesh, TH)
Define parameters
mu = 0.0035
rho = 1060
u_max = 0.1
R = 0.01
Q_in = Constant(1.0)
u_in_h = Expression(‘sqrt(pow(4Q/(pipow(R, 2)), 2))’, Q=1.0, R=1.0, degree=1)
u_in_v = Expression(‘sqrt(pow(4Q/(pipow(R, 2)), 2))’, Q=0.5, R=1.5*R, degree=1)
u_bc_h = DirichletBC(X.sub(0), u_in_h, ‘near(x[0], 0)’)
u_bc_v = DirichletBC(X.sub(0), u_in_v, ‘near(x[0], 0)’)
Define variational problem for healthy vein
u_h, p_h = TrialFunctions(X)
v_h, q_h = TestFunctions(X)
f = Constant((0, 0))
a_h = rho*inner(u_h, v_h)dx + muinner(grad(u_h), grad(v_h))dx - div(v_h)p_hdx
L_h = rhoinner(f, v_h)dx - p_hdiv(v_h)*dx + inner(u_in_h, v_h)*ds(1) + inner(u_h, v_h)dx - q_hdiv(u_h)*ds(1)
Define variational problem for varicose vein
u_v, p_v = TrialFunctions(X)
v_v, q_v = TestFunctions(X)
a_v = rho*inner(u_v, v_v)dx + muinner(grad(u_v), grad(v_v))dx - div(v_v)p_vdx - q_vdiv(u_v)dx
L_v = rhoinner(f, v_v)dx - p_vdiv(v_v)*dx + inner(u_in_v, v_v)*ds + dot(u_v, v_v)*dx
Solve for healthy vein
uh_ph = Function(X)
solve(a_h == L_h, uh_ph, u_bc_h)
Extract solution components
u_h, p_h = uh_ph.split()
Compute wall shear stress in healthy vein
n = FacetNormal(mesh)
tau_h = -mu*inner(nabla_grad(u_h), n)
Solve for varicose vein
uv_pv = Function(X)
solve(a_v == L_v, uv_pv, u_bc_v)
Extract solution components
u_v, p_v = uv_pv.split()
Compute wall shear stress in varicose vein
tau_v = -mu*inner(nabla_grad(u_v), n)
Output results
File(‘healthy_vein.pvd’) << u_h
File(‘varicose_vein.pvd’) << u_v
File(‘healthy_tau.pvd’) << tau_h
File(‘varicose_tau.pvd’) << tau_v
Shapes do not match: and .
UFLException Traceback (most recent call last)
in
30 f = Constant((0, 0))
31 a_h = rho*inner(u_h, v_h)dx + muinner(grad(u_h), grad(v_h))dx - div(v_h)p_hdx
—> 32 L_h = rhoinner(f, v_h)dx - p_hdiv(v_h)*dx + inner(u_in_h, v_h)*ds(1) + inner(u_h, v_h)dx - q_hdiv(u_h)*ds(1)
33
34
/usr/local/lib/python3.6/dist-packages/ufl/operators.py in inner(a, b)
167 if a.ufl_shape == () and b.ufl_shape == ():
168 return a * Conj(b)
→ 169 return Inner(a, b)
170
171
/usr/local/lib/python3.6/dist-packages/ufl/tensoralgebra.py in new(cls, a, b)
159 ash, bsh = a.ufl_shape, b.ufl_shape
160 if ash != bsh:
→ 161 error(“Shapes do not match: %s and %s.” % (ufl_err_str(a), ufl_err_str(b)))
162
163 # Simplification
/usr/local/lib/python3.6/dist-packages/ufl/log.py in error(self, *message)
170 “Write error message and raise an exception.”
171 self._log.error(*message)
→ 172 raise self._exception_type(self._format_raw(*message))
173
174 def begin(self, *message):
UFLException: Shapes do not match: and .