Решение уравнения теплопроводности с помощью FEniCS
Я сталкиваюсь с ошибкой кодирования в FEniCS, когда я запускаю код уравнения теплопроводности, с которым он не работает,
error = np.abs(u_e.vector().array() - u.vector().array())
AttributeError: 'dolfin.cpp.la.PETScVector' object has no attribute 'array’
Я полагаю, что идея состоит в том, чтобы рассчитать разницу между u и точным решением для каждого временного уровня и поместить их в массив, тогда мы возьмем максимальное значение (если нет, поправьте меня, пожалуйста!)
Исходный код для вычисления ошибки
u_e = interpolate(u_D, V)
error = np.abs(u_e.vector().array() - u.vector().array()).max()
print('t = %.2f: error = %.3g' % (t, error))
Где u_D - граничное условие.
Я не уверен, как я могу заставить это работать, поэтому любой совет от Вас был бы оценен.
заранее спасибо
0 ответов
Предлагаю использовать преобразование из numpy
модуль, если вам нужны более легкие обозначения:
u_v = numpy.array(u.vector())
Или, если вы предпочитаете сохранить структуру исходной переменной
u_v = u.vector()
Я предпочитаю первый, так как мне удобнее использовать векторы в стиле MatLab.
Согласно комментарию Роби, array()
был заменен на get_local()
. Итак, в строках 62-65 третьего учебника по фенике работает следующее:
# Compute error at vertices
u_e = interpolate(u_D, V)
error = np.abs(u_e.vector().get_local() - u.vector().get_local()).max()
print('t = %.2f: error = %.3g' % (t, error))