0

我需要存储一个昂贵的有限元计算解决方案,以便在进一步分析中使用它。浏览我迄今为止发现的教程,我可以像这样存储我的结果:

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()

不幸的是,我几乎不知道我到底在做什么。这是存储和加载计算结果的正确方法吗?(对于同一个网格文件)中的元素顺序是否u.vector()在不同 FEniCS 版本内/之间是固定的,或者它只是一个可能随时更改的实现细节?如果它不安全,那么这样做的正确方法是什么?

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

4

1 回答 1

0

不,根据回答是否在运行之间保留了元素的顺序?VectorVector不保证保留元素的顺序。

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

于 2019-05-10T16:40:37.337 回答