标记网格的子区域
透过现象看本质对我们理解程序有很大帮助。在FEniCS里,我们能通过调用函数set_log_level()
够将控制程序运行日志的打印。函数set_log_level()
可以传入一个数字用于指定输出日志的等级(这是一个可选参数,默认是20),高于这个等级的日志会被打印出来。因此,命令set_log_level(1)
能让系统输出尽可能多的日志信息。(其实我也不知道这段话为什么出现在这里。原文就是这么写的)
正文
在标记子区域之前,我们必须先给定边界条件。给每个边界条件都定义一个类,总共三个。首先定义整个边界条件为非滑移边界条件,然后再将一部分边界定义为流入,一部分为流出。
# 整个区域
class Noslip(SubDomain):
def inside(self, x, on_boundary):
return on_boundary
# 右端流入
class Inflow(SubDomain):
def inside(self, x, on_boundary):
return x[0] > 1.0 - DOLFIN_EPS and on_boundary
# 左端流出
class Outflow(SubDomain):
def inside(self, x, on_boundary):
return x[0] < DOLFIN_EPS and on_boundary
然后导入网格:
mesh = Mesh("../dolfin_fine.xml.gz")
我们实例化MeshFunction
,用于存储子区域的编号。创建MeshFunction
时,第一项参数可以填int
,size_t
, double
和 bool
,它的意思就是你可以用整数编号,浮点数标号,布尔类型标号等等。第二项参数指定网格。第三项参数指定维数,显而易见,区域边界的维数是比区域少一维的。
sub_domains = MeshFunction("size_t", mesh, mesh.topology().dim() - 1)
现在我们可以给每个区域标号了。我们将会创建四个子区域,每一个边界都给一个边界条件,第四个是内部(???)。首先我们把所有面都标记为3。
sub_domains.set_all(3)
对流入流出边界做同样的事情,流入为1,流出为2。
inflow = Inflow()
inflow.mark(sub_domains, 1)
outflow = Outflow()
outflow.mark(sub_domains, 2)
最后为了为了让这些子区域能够在其他程序中被调用,将他们存为xml或者vtk文件。
# Save sub domains to file
file = File("subdomains.xml")
file << sub_domains
# Save sub domains to VTK files
file = File("subdomains.pvd")
file << sub_domains
终于翻译完了!!!
附上代码
from dolfin import *
set_log_level(1)
# Sub domain for no-slip (mark whole boundary, inflow and outflow will overwrite)
class Noslip(SubDomain):
def inside(self, x, on_boundary):
return on_boundary
# Sub domain for inflow (right)
class Inflow(SubDomain):
def inside(self, x, on_boundary):
return x[0] > 1.0 - DOLFIN_EPS and on_boundary
# Sub domain for outflow (left)
class Outflow(SubDomain):
def inside(self, x, on_boundary):
return x[0] < DOLFIN_EPS and on_boundary
mesh = Mesh("dolfin_fine.xml.gz")
sub_domains = MeshFunction("size_t", mesh, mesh.topology().dim() - 1)
sub_domains.set_all(3)
noslip = Noslip()
inflow = Inflow()
outflow = Outflow()
noslip.mark(sub_domains, 0)
inflow.mark(sub_domains, 1)
outflow.mark(sub_domains, 2)
# Save sub domains to file
file = File("subdomains.xml")
file << sub_domains
# Save sub domains to VTK files
file = File("subdomains.pvd")
file << sub_domains
2019-3-28
网友评论