Решение уравнения теплопроводности с помощью 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))
Другие вопросы по тегам