Прерывистый Галёркин / Пуассон / Феникс

10

Я пытаюсь решить двумерное уравнение Пуассона, используя метод прерывистого Галеркина (DG) и следующую дискретизацию (у меня есть файл png, но мне не разрешено загружать его, извините):

Уравнение:

(κT)+f=0

Новые уравнения:

Qзнак равноκTQзнак равно-е

Слабая форма с числовыми потоками и : дT^Q^

QвесdВзнак равно-T(κвес)dВ+κT^NвесdSQvdВзнак равноvеdВ+Q^NvdS

Числовые потоки (метод IP):

Q^знак равно{T}-С11[T]T^знак равно{T}

с

{T}знак равно0,5(T++T-)[T]знак равноT+N++T-N-

Я написал простой скрипт на Python для решения уравнения. Решение, которое я получаю, не очень хорошее. Я был бы очень признателен, если бы кто-нибудь, знакомый с методом DG, мог бы быстро взглянуть на сценарий ниже и сказать, что я делаю неправильно.

Непрерывная формулировка галеркина, которую я добавил в сценарий, дает хорошее решение.

Заранее большое спасибо.

from dolfin import *

method = "DG" # CG / DG

# Create mesh and define function space
mesh = UnitSquare(32, 32)
V_q = VectorFunctionSpace(mesh, method, 2)
V_T = FunctionSpace (mesh, method, 1)
W = V_q * V_T

# Define test and trial functions
(q, T) = TrialFunctions(W)
(w, v) = TestFunctions(W)

# Define mehs quantities: normal component, mesh size
n = FacetNormal(mesh)

# define right-hand side
f = Expression("500.0*exp(-(pow(x[0] - 0.5, 2) + pow(x[1] - 0.5, 2)) / 0.02)")

# Define parameters
kappa = 1.0

# Define variational problem
if method == 'CG':
  a = dot(q,w)*dx \
       + T*div(kappa*w)*dx \
       + div(q)*v*dx

elif method == 'DG':
  #modele = "IP"
  C11 = 1.

  a = dot(q,w)*dx + T*div(kappa*w)*dx \
      - kappa*avg(T)*dot(n('-'),w('-'))*dS \
                                           \
      + dot(q,grad(v))*dx \
      - dot( avg(grad(T)) - C11 * jump(T,n) ,n('-'))*v('-')*dS

L = -v*f*dx

# Compute solution
qT = Function(W)
solve(a == L, qT)

# Project solution to piecewise linears
(q , T) = qT.split()

# Save solution to file
file = File("poisson.pvd")
file << T

# Plot solution
plot(T); plot(q)
interactive()
micdup
источник

Ответы:

10

Чтобы реализовать вашу задачу в FEniCS, вы должны заменить интегралы в терминах границ интегралами в терминах ребер. Это вводит скачки / средние значения в тестовые функции, которые вы полностью упускаете в своей реализации. Следовательно, система не обратима, и ваше решение не выглядит правильным. Уравнение (3.3) в Arnold et. и др. 2002 дает вам инструмент для переписывания слабой формы:

ΣКTчасКQКNКφКdsзнак равноΓ[Q]{φ}ds+Γ0{Q}[φ]ds

Здесь - это объединение ваших ребер и без границ.Γ 0ΓΓ0

Теперь ваши потоки однозначны, что означает, что вы можете отбрасывать скачки ваших потоков. Следовательно,

ΣКTчасКQ^NКvКdsзнак равноΓ0Q^[v]ds+ΩQ^NvdsΣКTчасКвесNКκT^dsзнак равноΓ[вес]κT^ds

Это приводит нас к следующей модификации вашего кода:

C11 = 1.
qhat = avg(grad(T)) - C11 * kappa*jump(T,n)
qhatbnd = grad(T) - C11 * kappa*T*n

a = dot(q,w)*dx + T*div(kappa*w)*dx \
  - kappa*avg(T)*jump(w,n)*dS \
  - kappa*T*dot(w,n)*ds \
  - dot(q,grad(v))*dx \
  + dot( qhat, jump(v,n))*dS \
  + dot( qhatbnd, v*n)*ds

У меня еще не было времени, чтобы на самом деле попробовать это, так что будьте в курсе возможных ошибок знака и т. Д. Но я надеюсь, что это все равно поможет.

Список литературы: Д. Н. Арнольд, Ф. Бреззи, Б. Кокберн, Л. Д. Марини: Объединенный анализ разрывных методов Галеркина для эллиптических задач SIAM J. Num. Anal, 39 (2002), 1749-1779

Кристиан Валуга
источник
Да, я действительно что-то упустил.
micdup
-2

Да, я действительно что-то упустил!

Сейчас работает нормально.

Большое спасибо за вашу помощь!

micdup
источник
2
Ради полноты, не могли бы вы описать, чего вам не хватало и как вы это исправили.
Павел