这样编写/阅读解决方案的方法安全吗?

时间:2019-05-09 16:01:06

标签: python finite-element-analysis fenics

我需要存储一个昂贵的FEM计算解决方案,以便将其用于进一步的分析。浏览到目前为止发现的教程,以便可以将结果存储如下:

\d+?/\d+|\d+[^/]

,然后像这样加载它们:

from fenics import *

mesh = Mesh('mesh/UnitSquare8x8.xml')

V = FunctionSpace(mesh, 'P', 1)
u = TrialFunction(V)
v = TestFunction(V)
f = Constant(-6.0)
a = dot(grad(u), grad(v))*dx
L = f*v*dx

u_D = Expression('1 + x[0]*x[0] + 2*x[1]*x[1]', degree=2)

def boundary(x, on_boundary):
    return on_boundary

bc = DirichletBC(V, u_D, boundary)

A = assemble(a)
b = assemble(L)
bc.apply(A, b)

u = Function(V)    
solver = KrylovSolver("cg", "ilu")
solver.solve(A, u.vector(), b)

File('solution.xml') << u.vector()

不幸的是,我几乎不知道我在这里到底在做什么。这是存储和加载计算结果的正确方法吗? from fenics import * mesh = Mesh('mesh/UnitSquare8x8.xml') V = FunctionSpace(mesh, 'P', 1) u = Function(V) File('solution.xml') >> u.vector() 中的元素顺序(对于同一网格文件)是否在不同的FEniCS版本之间/之间固定,或者仅仅是实现细节,随时可能更改?如果不安全,那么正确的方法是什么?

我找到了另一个(可能甚至更危险)的解决方案。我可以使用u.vector()VALUES = u.vector().get_local()方法,因为u.vector().set_local(VALUES)是一个可以轻松存储和加载的numpy数组。

1 个答案:

答案 0 :(得分:0)

否,根据对Is the order of Vector elements preserved between runs?的回答,不保证保留Vector元素的顺序。

建议改用XDMFFile.write_checkpoint()XDMFFile.read_checkpoint()方法。