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


10

Я намагаюся розв’язати 2D рівняння Пуассона за допомогою методу Переривчастий Галеркін (DG) та наступної дискретизації (у мене є png-файл, але мені не дозволяється завантажувати його, вибачте):

Рівняння:

(κT)+f=0

Нові рівняння:

q=κTq=f

Слабка форма з числової флюси T і Q :T^q^

qwdV=T(κw)dV+κT^nwdSqvdV=vfdV+q^nvdS

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

q^={T}C11[T]T^={T}

з

{T}=0.5(T++T)[T]=T+n++Tn

Для написання рівняння я написав простий сценарій пітона для феніків. Я отримую рішення не добре. Я дуже вдячний, якщо хтось, знайомий із методом 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()

Відповіді:


10

Щоб реалізувати свою проблему в FEniCS, вам слід замінити інтеграли з точки зору меж інтегралами з точки зору ребер. Це вводить стрибки / середні показники в тестових функціях, які ви повністю пропускаєте у своїй реалізації. Отже, система не є зворотною, і ваше рішення не виглядає правильно. Рівняння (3.3) у Arnold et. ін. 2002 рік дає вам інструмент для переписування слабкої форми:

KThKqKnKϕKds=Γ[q]{ϕ}ds+Γ0{q}[ϕ]ds

Тут - це об'єднання ваших країв і однакове без меж.ΓΓ0

Тепер ваші флюси однозначні, це означає, що ви можете скидати стрибки ваших флюсів. Звідси

KThKq^nKvKds=Γ0q^[v]ds+Ωq^nvdsKThKwnKκT^ds=Γ[w]κ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. Анальний, 39 (2002), 1749-1779


Так, я справді чогось бракував.
micdup

-2

Так, я справді щось пропускав!

Зараз це добре працює.

Дуже дякую за допомогу!


2
Для повноти ви могли б описати, чого саме вам не вистачало і як ви це виправили.
Пол
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.