FEniCS中文翻译

标记网格的子区域

2019-03-28  本文已影响0人  马鹏飞_47c5

标记网格的子区域

透过现象看本质对我们理解程序有很大帮助。在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时,第一项参数可以填intsize_tdoublebool,它的意思就是你可以用整数编号,浮点数标号,布尔类型标号等等。第二项参数指定网格。第三项参数指定维数,显而易见,区域边界的维数是比区域少一维的。

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

上一篇 下一篇

猜你喜欢

热点阅读