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

Я не уверен, как я могу заставить его работать, поэтому любой ваш совет будет признателен.

заранее спасибо


person roby    schedule 09.08.2018    source источник
comment
Я нашел ответ и хотел бы поделиться им с вами, на всякий случай, если кому-то интересно. array () был заменен на get_local ().   -  person roby    schedule 15.09.2018
comment
Не могли бы вы опубликовать это в качестве ответа? Это решило мою проблему!   -  person AccidentalBismuthTransform    schedule 13.02.2019
comment
Спасибо @roby. У меня была аналогичная ошибка, замена array () на get_local () тоже решила мою проблему .. :)   -  person tired and bored dev    schedule 01.04.2019


Ответы (2)


Согласно комментарию Роби, 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))
person Community    schedule 25.07.2019

Я предлагаю использовать преобразование из модуля numpy, если вам нужны более легкие обозначения:

u_v = numpy.array(u.vector())

Или, если вы предпочитаете сохранить структуру исходной переменной

u_v = u.vector()

Я предпочитаю первый, так как мне удобнее использовать векторы в стиле MatLab.

person Eddymage    schedule 02.04.2020