Galerkin / Poisson / Fenics discontinui


10

Sto cercando di risolvere l'equazione di Poisson 2D usando il metodo Discontinuous Galerkin (DG) e la seguente discretizzazione (ho un file png ma non mi è permesso caricarlo, mi dispiace):

Equazione:

(κT)+f=0

Nuove equazioni:

q=κTq=f

Forma debole con numerica fondenti T e q :T^q^

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

Flussi numerici (metodo

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

con

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

Ho scritto un semplice script in pitone fenics per risolvere l'equazione. La soluzione che ottengo non è buona. Gradirei davvero se qualcuno che avesse familiarità con il metodo DG avrebbe potuto dare una rapida occhiata allo script seguente e dirmi cosa sto facendo di sbagliato.

La formulazione continua di galerkin che ho aggiunto nella sceneggiatura offre una buona soluzione.

Grazie mille in anticipo.

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

Risposte:


10

ΣKThKqKnKφKdS=Γ[q]{φ}dS+Γ0{q}[φ]dS

ΓΓ0

ΣKThKq^nKvKdS=Γ0q^[v]dS+Ωq^nvdSΣKThKwnKκT^dS=Γ[w]κT^dS

Questo ci porta alla seguente modifica del tuo codice:

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

Non ho ancora avuto il tempo di provarlo, quindi fai attenzione ai possibili errori di segno, ecc. Ma spero che questo aiuti comunque.

Riferimenti: DN Arnold, F. Brezzi, B. Cockburn, LD Marini: analisi unificata dei metodi discontinui di Galerkin per problemi ellittici SIAM J. Num. Anale, 39 (2002), 1749-1779


Sì, mi mancava davvero qualcosa.
micdup,

-2

Sì, mi mancava davvero qualcosa!

Ora funziona bene.

Grazie mille per il tuo aiuto!


2
Per completezza, potresti descrivere cosa ti mancava e come lo hai risolto.
Paolo
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.