Galerkin discontinuo / Poisson / Fenics

10

Estoy tratando de resolver la ecuación de Poisson en 2D usando el método Discontinuous Galerkin (DG) y la siguiente discretización (tengo un archivo png pero no puedo cargarlo, lo siento):

Ecuación:

(κT)+F=0 0

Nuevas ecuaciones:

q=κTq=-F

Forma débil con los flujos numéricos T y Q :T^q^

qwreV=-T(κw)reV+κT^nortewreSqvreV=vFreV+q^nortevreS

Flujos numéricos (método

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

con

{T}=0,5(T++T-)[T]=T+norte++T-norte-

Escribí un sencillo script de Python para resolver la ecuación. La solución que obtengo no es buena. Realmente agradecería si alguien familiarizado con el método DG pudiera echar un vistazo rápido al script a continuación y decirme qué estoy haciendo mal.

La formulación continua de galerkin que agregué en el script brinda una buena solución.

Muchas gracias por adelantado.

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
fuente

Respuestas:

10

KThKqKnorteKϕKres=Γ[q]{ϕ}res+Γ0 0{q}[ϕ]res

ΓΓ0 0

KThKq^norteKvKres=Γ0 0q^[v]res+Ωq^nortevresKThKwnorteKκT^res=Γ[w]κT^res

Esto nos lleva a la siguiente modificación de su código:

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

Todavía no tenía tiempo para intentarlo, así que tenga en cuenta los posibles errores de signos, etc. Pero espero que esto ayude de todos modos.

Referencias: DN Arnold, F. Brezzi, B. Cockburn, LD Marini: Análisis unificado de los métodos discontinuos de Galerkin para problemas elípticos SIAM J. Num. Anal, 39 (2002), 1749-1779

Christian Waluga
fuente
Sí, realmente me faltaba algo.
micdup
-2

Sí, realmente me faltaba algo!

Está funcionando bien ahora.

¡Muchas gracias por tu ayuda!

micdup
fuente
2
Para completar, ¿podría describir qué era lo que se estaba perdiendo y cómo lo solucionó?
Paul