heat_complete.py
来自「利用有限元算法计算各类微分方程」· Python 代码 · 共 104 行
PY
104 行
from dolfin import *# Source termclass Source(Function): def __init__(self, element, mesh): Function.__init__(self, element, mesh) def eval(self, values, x): values[0] = 0.0# Source termclass InitialValue(Function): def __init__(self, element, mesh): Function.__init__(self, element, mesh) def eval(self, values, x): values[0] = 1.0# Neumann boundary conditionclass Flux(Function): def __init__(self, element, mesh): Function.__init__(self, element, mesh) def eval(self, values, x): values[0] = 0.0# Sub domain for Dirichlet boundary conditionclass DirichletBoundary(SubDomain): def inside(self, x, on_boundary): return bool(on_boundary)# Load mesh and create finite elementsmesh = Mesh("Square.xml")mesh.refine()element = FiniteElement("Lagrange", "triangle", 1)element2 = FiniteElement("Lagrange", "triangle", 2)# Define variational problemv = TestFunction(element)U = TrialFunction(element)f = Source(element2, mesh)g = Flux(element, mesh)c = 0.01# Sub domain for Dirichlet boundary conditionclass DirichletBoundary(SubDomain): def inside(self, x, on_boundary): return bool(on_boundary)# Initialise source function and previous solution functionf = Source(element2, mesh)u0 = InitialValue(element, mesh)# ParametersT = 0.5k = 0.01t = k# Test and trial functionsv = TestFunction(element)u = TrialFunction(element)# Functionsx0 = Vector()x1 = Vector()u1 = Function(element, mesh, x1)h = MeshSize("triangle", mesh)c = 1.0# Variational problema = (u*v+k*dot(grad(u),grad(v)))*dxL = (u0*v+f*v)*dx# Set up boundary conditionboundary = DirichletBoundary()zero = Function(mesh, 0.0)bc = DirichletBC(zero, mesh, boundary)# Assemble matrix (since heat coefficient c is constant in time, the matrix# A is also constant in time)A = assemble(a, mesh)# Output fileout_file = File("temperature.pvd")# Time-steppingwhile t < T: # Assemble vector and apply boundary conditions b = assemble(L, mesh) bc.apply(A, b, a) # Solve the linear system solve(A, x1, b) # Save the solution to file out_file << u1 # Move to next interval t += k # Copy solution from previous interval u0.assign(u1)
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?