Безопасен ли такой способ написания / чтения решения? - PullRequest
0 голосов
/ 09 мая 2019

Мне нужно хранить решение дорогостоящего расчета МКЭ, чтобы использовать его в дальнейшем анализе.Просматривая учебники, которые я обнаружил, я могу сохранять свои результаты следующим образом:

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 - это пустой массив, который я могу легко хранить и загружать.

1 Ответ

0 голосов
/ 10 мая 2019

Нет, согласно ответу на Сохраняется ли порядок Vector элементов между прогонами? Не гарантируется, что порядок Vector элементов сохраняется.

Рекомендуетсявместо этого использовать XDMFFile.write_checkpoint() и XDMFFile.read_checkpoint() методы.

...