我的计划是求解域右半部分的热方程,同时使左半部分与恒温完全隔离。为此,我使用非常低的电导率对左半部分进行建模。然后我在右半部分的顶部应用热通量,在底部应用 Dirichlet BC。对于左侧部分,我只是将 Dirichlet BC 应用于左侧。我认为左边的部分不会受到影响,并且温度恒定,因为它的电导率很低。
右半边的边界条件
左半边的边界条件
我正在用一阶拉格朗日元素解决这个问题。我期待在右半部分看到我的解决方案,然后让左半部分大部分恒定,值为 0,并在靠近界面的位置快速变化以保持连续性。考虑到左半部分主要是绝缘材料,这是有道理的。相反,我看到的是从界面到边界的平滑过渡。我的数学实现有问题吗?如果有帮助,请附上 FEniCS 代码
from dolfin import *
mesh = UnitSquareMesh(100, 100)
V = FunctionSpace(mesh, 'CG', 1)
t, w = TrialFunction(V), TestFunction(V)
Rho = FunctionSpace(mesh, 'DG', 0)
rho = Function(Rho)
rho.interpolate(Expression("(x[0] > 0.5) + 1e-8", domain=mesh, degree=1))
File("test_rho.pvd") << rho
a = inner(rho*grad(t), grad(w))*dx
top = CompiledSubDomain("x[1] > 1 - 0.01 && x[0] >= 0.5")
bottom_right = CompiledSubDomain("x[0] >= 0.5 && x[1] < 0.01")
left = CompiledSubDomain("x[0] <= 0.001")
meshfunc_ds = MeshFunction("size_t", mesh, mesh.topology().dim() - 1)
TOP, LEFT, BOTTOMRIGHT = 1, 2, 3
top.mark(meshfunc_ds, TOP)
left.mark(meshfunc_ds, LEFT)
bottom_right.mark(meshfunc_ds, BOTTOMRIGHT)
File("test_measures.pvd") << meshfunc_ds
ds = Measure("ds")(subdomain_data=meshfunc_ds)
L = Constant(5.0)*w*ds(TOP)
bc1 = DirichletBC(V, Constant(0.0), meshfunc_ds, BOTTOMRIGHT)
bc2 = DirichletBC(V, Constant(0.0), meshfunc_ds, LEFT)
t_sol = Function(V)
solve(a==L, t_sol, bcs=[bc1, bc2])
File("test_temperature.pvd") << t_sol
```