Süreksiz Galerkin / Poisson / Fenics


10

Süreksiz Galerkin yöntemini (DG) ve aşağıdaki takdir yetkisini kullanarak 2D Poisson denklemini çözmeye çalışıyorum (bir png dosyası var, ancak yüklememe izin verilmiyor, üzgünüm):

Denklem:

(κT)+f=0

Yeni denklemler:

q=κTq=f

ve sayısal akıları ile zayıf form :T^q^

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

Sayısal akışlar (IP yöntemi):

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

ile

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

Denklemi çözmek için basit bir fenik python betiği yazdım. Aldığım çözüm iyi değil. DG yöntemine aşina birisinin aşağıdaki senaryoya hızlı bir şekilde bakıp neyi yanlış yaptığımı söylemesi gerçekten çok memnun olur.

Senaryoya eklediğim sürekli galerkin formülasyonu güzel bir çözüm sunuyor.

Şimdiden çok teşekkürler.

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()

Yanıtlar:


10

Probleminizi FEniCS'de uygulamak için sınırlar içindeki integralleri kenarlar açısından integrallerle değiştirmeniz gerekir. Bu, test işlevlerinde, uygulamanızda tamamen kaçırdığınız atlamaları / ortalamaları tanıtır. Bu nedenle, sistem ters çevrilemez ve çözümünüz doğru görünmüyor. Denklem (3.3) Arnold ve ark. ark. 2002 size zayıf formu yeniden yazmak için bir araç sunar:

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

İşte sizin kenarları ve birliği olduğunu sınırları olmadan aynı.ΓΓ0

Şimdi akılarınız tek değerli, yani akılarınızın atlamasını bırakabilirsiniz. Bu nedenle

ΣKThKq^nKvKds=Γ0q^[v]ds+Ωq^nvdsΣKThKwnKκT^ds=Γ[w]κT^ds

Bu bizi aşağıdaki kod değişikliğine götürür:

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

Aslında bunu denemek için henüz zamanım olmadı, bu yüzden olası işaret hatalarının vb. Farkında olun. Ama umarım bu yine de yardımcı olur.

Kaynaklar: DN Arnold, F. Brezzi, B. Cockburn, LD Marini: Eliptik Sorunlarda Süreksiz Galerkin Yöntemlerinin Birleşik Analizi SIAM J. Num. Anal, 39 (2002), 1749-1779


Evet, gerçekten bir şey eksikti.
micdup

-2

Evet, gerçekten bir şey eksikti!

Şimdi iyi çalışıyor.

Yardımınız için çok teşekkür ederim!


2
Tamlık uğruna, neyin eksik olduğunu ve nasıl düzelttiğinizi anlatabilir misiniz?
Paul
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.